给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
非递归算法:利用栈实现递归到非递归的转换
递归的本质:先调用的函数压栈,一层一层递归调用其实就是栈顶元素(函数)不断出栈的过程
1.非递归解法
# 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 []
res=[]
# 用栈将递归转为非递归
stack=[]
p=root
while stack!=[] or p!=None:
while p!=None:
stack.append(p)
p=p.left
if stack!=[]:
p=stack[-1]
res.append(p.val)
# 出栈
stack.pop()
p=p.right
return res
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 []
res=[]
def inorder(root):
# 递归出口 叶子节点的访问
if root.left==None and root.right==None:
res.append(root.val)
return
if root.left!=None:inorder(root.left)
#注意中序遍历时,root节点访问的顺序在左节点访问完之后,再对右子树递归
res.append(root.val)
if root.right!=None:inorder(root.right)
inorder(root)
return res