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,[])]