题目:
首先说说二叉树的遍历,分为,前序,中序和后序遍历
前序遍历:根结点、左子树、右子树。
中序遍历:左子树、根结点、右子树。
后序遍历:左子树、右子树、根结点。
方法一:递归
递归的方法很简单,反复调用方法本身,当其没有左右孩子时,返回该节点的值,
再根据中序遍历的顺序对二叉树进行遍历。
代码如下。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return []
elif root.left is None and root.right is None:
return [root.val]
else:
return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
方法二:迭代
迭代方法对比递归的方法就稍显复杂,需要构建一个零时的堆栈
从根节点开始,如果其有左孩子节点,则入栈,再判断其左孩子是否有左孩子节点,以此类推。
当没有左孩子节点时,将该节点和其双亲节点出栈加入res列表,再将其双亲节点的右孩子节点入栈,寻找其左孩子节点,以此类推。
代码如下。
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def inorderTraversal(self, root): res = [] self.iterative_inorder(root,res) print(res) return res def iterative_inorder(self, root, res): temp = [] while root or temp: if root: temp.append(root) root = root.left else: root = temp.pop(-1) res.append(root.val) root = root.right return res