一.问题描述
Given a binary tree, return the inorder traversal of its nodes' values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?
二.解题思路
inorder Traversal:中序遍历,即左中右。
1.用递归解决的话非常简单。
合并左递归(子树)的结果,将root val 添加到结果中,然后再合并右递归的结果。
时间复杂度O(N),空间复杂度O(N)
难点就像题目说的,用非递归的方法来解决。
2.非递归
非递归得用一个堆栈来记录父亲节点,以便孩子遍历完的时候返回。
非递归的思路就是,对于当前的节点,
1.沿着左子树一直遍历,并把当前节点加入到栈中。(左中右中左的操作实现)
2.当左子树遍历完(即碰到none),弹出父节点,将节点val加入到res中,(中操作)
3.如果有右子树,将右子树入栈,返回至1,若当前节点没有右子树,弹出栈顶一直循环直到找到一个节点有右子树或者栈空。(右操作)
这个模块还会附上一个别人实现的代码,会更清晰一点。
更多leetcode算法题解法: 专栏 leetcode算法从零到结束
三.源码
1.递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#43
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:return
res=[]
if root.left:res.extend(self.inorderTraversal(root.left))
res.append(root.val)
if root.right:res.extend(self.inorderTraversal(root.right))
return res
2.1.非递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#43
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:return
stack,res=[root],[]
while stack:
while root.left:
stack.append(root.left)
root=root.left
while stack:
root=stack.pop()
res.append(root.val)
if root.right:
stack.append(root.right)
root=root.right
break
return res
#version 2
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#43
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:return
stack,res=[],[]
while stack or root:
while root:
stack.append(root)
root=root.left
root=stack.pop()
res.append(root.val)
root=root.right
return res
2.2. 非递归,代码来自https://leetcode.com/problems/binary-tree-inorder-traversal/discuss/423641/Python-iterative-solution-or-100-faster
class Solution:
def inorderHelper(self, root: TreeNode) -> List[int]:
stack, res = [], []
while True:
while root is not None:
stack.append(root)
root = root.left
if len(stack) == 0:
break
root = stack.pop()
res.append(root.val)
root = root.right
return res
def inorderTraversal(self, root: TreeNode) -> List[int]:
return self.inorderHelper(root)