非递归框架
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def orderTraversal(self, root: TreeNode) -> List[int]:
p, r = root, None
s = []
ans = []
while(len(s) > 0 or p is not None): # s模拟栈,p是当前节点
if(p is not None):
...
else:
...
return ans
前序遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
p, r = root, None
s = []
ans = []
while(len(s) > 0 or p is not None):
if(p is not None):
ans.append(p.val)
s.append(p)
p = p.left
else:
p = s[len(s)-1]
s.remove(s[len(s)-1])
p = p.right
return ans
中序遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
p, r = root, None
s = []
ans = []
while(len(s) > 0 or p is not None):
if(p is not None):
s.append(p)
p = p.left
else:
p = s[len(s)-1]
s.remove(s[len(s)-1])
ans.append(p.val)
p = p.right
return ans
前序和中序只需交换一下append的位置即可,但后续可以吗?你猜呢

后序遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
p, r = root, None
s = []
ans = []
while(len(s) > 0 or p is not None):
if(p is not None):
s.append(p)
p = p.left
else:
p = s[len(s)-1]
# 如果没有右节点,或者已经走过右子树,可加入根节点
if(p.right is None or p.right is r):
ans.append(p.val)
s.remove(s[len(s)-1])
r = p # 记录根节点
p = None
else:
p = p.right
return ans
最近公共父节点
参考:https://blog.youkuaiyun.com/ACBattle/article/details/89482247
本文深入探讨了非递归框架下二叉树的前序、中序和后序遍历方法,提供了详细的算法实现,并讨论了最近公共父节点的查找技巧。通过模拟栈操作,实现了无需递归的二叉树遍历,为理解和实现二叉树遍历提供了一种新的视角。
338

被折叠的 条评论
为什么被折叠?



