问题描述:给定一个二叉树,返回它的中序 遍历。
问题分析:中序遍历:左,中,右
解决方法:颜色标记法
优点:易于理解,稍微更改可适用于前序,中序,后序遍历
其核心思想如下:
使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。
如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。
如果遇到的节点为灰色,则将节点的值输出。
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
WHITE, GRAY = 0, 1
res = []
stack = [(WHITE, root)]
while stack:
color, node = stack.pop()
if node is None: continue
if color == WHITE:
stack.append((WHITE, node.right))
stack.append((GRAY, node))
stack.append((WHITE, node.left))
else:
res.append(node.val)
return res
方法改进:
主要思想:使用数据类型代替颜色,如果遍历过程中遇到int类型,那么直接加入结果。
方法很巧妙,不需要增加其他的冗余部分,直接利用二叉树本身的结构进行遍历。
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
stack=[root]
result=[]
while stack:
i=stack.pop()
if isinstance(i,TreeNode):
stack.extend([i.right,i.val,i.left])
elif isinstance(i,int):
result.append(i)
return result