题目描述:
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
个人思路:
中序遍历的递归算法很简单,就按照L->D->R的顺序完成即可。二叉树递归算法需要考虑的主要是root节点处应该如何处理,左右子树递归调用即可。
迭代算法的话,需要使用栈结构。通过不断查找左子树,并保存当前所经历的节点,可以查找到最左侧的节点,该节点不具有左子树,并进行遍历操作,即添加至输出列表中,此时,再检查该节点是否具有右子树,继续进行该右子树的遍历即可。
具体代码如下:
# Definition for a binary tree node.
from typing import List
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
# 递归
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
results = []
def helper(root):
if not root:
return
helper(root.left) # L
results.append(root.val) # D 只需要考虑root节点该做什么处理
helper(root.right) # R
helper(root)
return results
# 迭代
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
results = []
node = root
stack = []
while node or stack:
while node: # 查找左子树并使用栈保存当前查找的路径
stack.append(node)
node = node.left
node = stack.pop() # 该节点不具有左子树
results.append(node) # 对当前节点完成遍历,即左节点
stack.append(node.right) # 对右节点尝试进行遍历
return results