题目描述
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?
算法思路
1.先入栈根节点左侧边界节点
2.从栈中拿出节点node,保存它的值,在查看node是否存在右侧节点,
如果有右侧节点,则再继续入栈右侧节点,以及入栈它的左侧边界节点
如果没有右侧节点,则继续从栈中拿出节点
在下面二叉树中,1的左侧边界节点为2和4,并不包含8.
1
/ \
2 3
/ \ /\
4 8 5 6
\
7
算法实现
class TreeNode():
def __init__(self,x):
self.val=x
self.left=None
self.right=None
class Solution:
def inorderTraversal(self,root):
res=[]
stack=[root]
left=root.left
#左节点全部先入栈——根节点最左侧节点(最左边界处的节点)
while left!=None:
stack.append(left)
left=left.left
#从栈中拿出节点
#1.拿出来的节点查看还有没有右侧节点
#2.有右侧节点的,先把他的左侧边界节点入栈
while stack:
node=stack.pop()
res.append(node.val)
t=node.right
while t:
stack.append(t)
t=t.left
return res
test=Solution()
n1=TreeNode(1)
n2=TreeNode(2)
n3=TreeNode(3)
n4=TreeNode(4)
n5=TreeNode(5)
n6=TreeNode(6)
n7=TreeNode(7)
n1.left=n2
n1.right=n3
n2.left=n4
n3.left=n5
n3.right=n6
n6.right=n7
"""
1
/ \
2 3
/ /\
4 5 6
\
7
"""
print(test.inorderTraversal(n1))
#[4, 2, 1, 5, 3, 6, 7]
小结
二叉树的中序迭代遍历比前序遍历考虑的要多一点,因为栈中要先存储所有左侧边界节点,然后在从栈中取出节点node并保存值,接下来要继续查看次节点是否存在右侧节点node*,若存在,还是得先将node*的左侧边界节点入栈。