题目
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
解法
思路:
- 使用栈来解决,优点是运行速度快,缺点是比较难记忆,我在纸上画图,才捋清楚逻辑。
从根节点开始,一直遍历左子树,遍历过程中,将遍历到的节点入栈,直到左子树为空,这时候就可以将栈顶的节点出栈,append到结果。
然后开始遍历栈顶节点的右子树,从右子树的根节点开始,一直遍历它的左子树,和第一步类似。
LeetCode题解里有示例图,可以结合示例图来理解。
# 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: TreeNode) -> List[int]:
result = []
s, cur = [], root
while cur or len(s):
while cur:
s.append(cur)
cur = cur.left
cur = s.pop()
result.append(cur.val)
cur = cur.right
return result
- 递归,递归的解法比较简单。
# 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: TreeNode) -> List[int]:
if not root:
return []
elif root.left and root.right:
return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
elif root.left:
return self.inorderTraversal(root.left) + [root.val]
elif root.right:
return [root.val] + self.inorderTraversal(root.right)
else:
return [root.val]