NC45 实现二叉树先序,中序和后序遍历
日期:2021.9.4
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
#
# @param root TreeNode类 the root of binary tree
# @return int整型二维数组
#
class Solution:
def threeOrders(self , root ):
# write code here
if root is None:
return [None,None,None]
def first(root):
'''
前序遍历,先读中节点,然后读左子树,最后右子树
'''
stack = [] #存储扫过的节点
res = [] #存储值
while root or stack:
while root is not None: #一直读到当前子树的最底层的最左侧
stack.append(root)
res.append(root.val)#添加父节点的值
root = root.left # 走向左子树
if stack:
node = stack.pop() #读取最后加入的节点
if node.right is not None:
root = node.right #走向右子树
return res
def middle(root):
'''
中序遍历,先读左子树,然后读父节点,最后右子树
'''
stack = []
res = []
while root or stack:
while root is not None:
stack.append(root)
root = root.left # 一直走到左子树的尽头
if stack:
node = stack.pop()
res.append(node.val) #读取最后一个加入节点的值(左子树为none的父节点的值)
if node.right is not None:
root = node.right #走向右子树
return res
def last(root):
'''
后序遍历,先读左子树,然后读右子树,最后父节点
【父节点的值、右节点、左节点】
【父节点的值、右节点、左节点的值、左—右节点、左-左节点】
【父节点的值、右节点、左节点的值、左—右节点、左-左节点的值】
实现后序遍历
'''
stack = []
res = []
stack.append(root) #压入父节点
while stack:
node = stack.pop()
if type(node) is TreeNode: #如果当前节点是父节点,将当前节点替换成节点值,并压入右节点、左节点
stack.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
else:
res.append(node) #当栈的头部是数字时,说明左侧走到了尽头,将父节点的值添加到列表中
return res
return [first(root),middle(root),last(root)] 递归解法
class Solution:
def threeOrders(self , root ):
# write code here
if root is None:
return [None,None,None]
def first(root,res = []):
if not root:
return
res.append(root.val)
first(root.left,res)
first(root.right,res)
return res
def middle(root,res):
if not root:
return
middle(root.left, res)
res.append(root.val)
middle(root.right, res)
return res
def last(root,res=[]):
if not root:
return
last(root.left,res)
last(root.right,res)
res.append(root.val)
return res
return [first(root,[]),middle(root,[]),last(root,[])] 
京公网安备 11010502036488号