题目:
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例:
输入:root = [1,null,2,3]
输出:[1,3,2]
思路:
方法1,递归,中序遍历顺序就是左根右,使用递归函数进行深度优先遍历,从根节点开始先调用递归函数遍历左子树,然后是根节点,在结果数组中加入根节点的值,然后调用递归函数遍历右子树,终止条件就是节点为空,最后返回结果数组。
方法2,迭代,
递归方法是在系统中使用栈空间实现遍历,这里直接利用栈和迭代进行遍历,栈顶弹出的元素就是下一个要加入结果中的元素,按这个思想弹出元素,初始化空栈,遍历二叉树,从根节点出发,不断向左子树遍历,将元素压入栈中,直到为空,然后出栈开始遍历元素,将出栈的元素放在结果列表中,开始遍历右子树,如果为空就继续出栈,将出栈元素放到结果里,遍历上一层节点的右子树,若非空就压入栈中,若为空就继续将栈顶元素出栈,直到遍历完二叉树的节点和栈中的元素,返回结果列表。
注意:结果列表中加入的节点元素的值,而不是节点本身。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
# 递归,深度优先遍历,递归调用栈来实现
# res = []
# def dfs(root):
# if not root:
# return
# dfs(root.left)
# res.append(root.val)
# dfs(root.right)
# dfs(root)
# return res
# 迭代,使用栈结构实现操作
res = []
stack = []
while stack or root:# 当都为空的时候才遍历完成
if root:
stack.append(root)
root = root.left
else:
temp = stack.pop()
res.append(temp.val)
root = temp.right
return res