给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2]
递归法:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root == None:
return []
left_list = self.inorderTraversal(root.left)
right_list = self.inorderTraversal(root.right)
return left_list + [root.val] + right_list
比较简单的就是使用递归法来解题,需要注意一下边界情况。当传进来的节点是一个空节点时,返回一个空列表,而不是None。中序遍历的结果即为左子节点的列表加本节点的值,再加上右子节点的列表。
迭代法:
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:
return []
res = []
stack = [[root, 0]]
while stack:
root, flag = stack[-1]
if root.left and flag == 0:
stack[-1][-1] = 1
stack.append([root.left, 0])
else:
stack.pop()
res.append(root.val)
if root.right:
stack.append([root.right, 0])
return res
遍历二叉树也可以使用迭代的方法完成。我们可以使用一个栈来模拟递归。每次传入一个非空节点时就对其进行入栈操作。然后我们需要关于每个节点再保存一个状态变量flag用来表示该节点是否已经遍历过它的左子节点,因为是中序遍历,所以先访问左子节点。如果存在左子节点并且root节点的flag为0,那么就把root节点的flag改为1,并将左子节点压入栈中。如果左子节点不存在,或者已经被访问过了,那么我们就要把root节点pop出栈,把当前的value加入到列表中,并检查root节点是否存在右子节点,如若存在再将右子节点push进栈。当我们的栈变为空时,即所有的节点都已访问完毕。