在上篇博客https://blog.csdn.net/tryhardsilently/article/details/86136216中描述了二叉树的构建,深度遍历(前序、中序、后序遍历)的递归实现、层次遍历
现在记录前序、中序、后序遍历的实现:
# 中序遍历非递归实现:
思路:
1、从根节点开始遍历左子树,遇到的每个节点入栈,直到左子树遍历完毕 2、栈顶出栈 当前节点指向其右子树
def inorder(root):
stack=[]
result=[]
if not root:
return []
while root or stack:
while root: # 遍历左子树节点 入栈
stack.append(root)
root=root.left
if stack:
tmp=stack.pop() #出栈
root=tmp.right # 访问右子树
result.append(tmp.val)
return result
print(inorder(root))
# 前序遍历
思路:
前序遍历与中序遍历的区别在于中序遍历是先访问左子树后访问根节点,前序遍历是先访问根节点后访问左子树,前序遍历更容易理解,实现起来大致相同。1、从根节点开始遍历左子树,遇到的节点入栈同时输出节点结果 2、栈顶出栈,访问其右子树
def pre(root):
stack = []
result = []
if not root:
return result
while root or stack:
while root:
stack.append(root)
result.append(root.val)
root = root.left
if stack:
cur = stack.pop()
root = cur.right
return result
print(pre(root))
# 后序遍历
思路:
后序遍历较前、中序遍历要稍复杂一些。同样的:1、遍历左子树,每个节点入栈,直到左子树为空 2、栈顶出栈 判断其右子树是否为空,若为空或者如果其右子树已经访问,则输出节点值;若其右子树存在且尚未访问,则此节点重新入栈,访问其右子树;
def post(root):
stack = []
result = []
tag = None
if not root:
return result
while stack or root:
# print(len(stack))
while root:
stack.append(root)
root = root.left
cur = stack.pop()
if cur.right == None or cur.right == tag:
result.append(cur.val)
tag = cur
root = None
else:
print(cur.val,result)
stack.append(cur)
root = cur.right
return result
print(post(root))