看到很多相关解法,感觉有些难以理解,发现了下面这个文章,分享给大家。里面的主要思路就是放一个空节点,利用空节点来完成其它管理工作。统一框架 方便理解。
#前序
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
if root:
stack.append(root)
while stack:
node = stack[-1]
if node:
stack.pop()
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
stack.append(node)
stack.append(None)
else:
stack.pop()
node = stack.pop()
res.append(node.val)
return res
#中序
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
if root:
stack.append(root)
while stack:
node = stack[-1]
if node:
#将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中
stack.pop()
#添加右节点(空节点不入栈)
if node.right:
stack.append(node.right)
#添加中节点
stack.append(node)
#中节点访问过,但是还没有处理,加入空节点作为标记
stack.append(None)
#添加左节点(空节点不入栈)
if node.left:
stack.append(node.left)
else:#只有在遇到空节点的时候,才将下一个节点放进结果集中
#将空节点弹出
stack.pop()
#重新取出栈中元素
node = stack.pop()
res.append(node.val)
return res
#后序
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
if root:
stack.append(root)
while stack:
node = stack[-1]
if node:
stack.pop()
stack.append(node)
stack.append(None)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
else:
stack.pop()
node = stack.pop()
res.append(node.val)
return res
作者:carlsun-2
链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/bang-ni-dui-er-cha-shu-bu-zai-mi-mang-che-di-chi-t/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。