非递归框架
# 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.csdn.net/ACBattle/article/details/89482247