数据结构:python递归实现二叉树前中后遍历+层次遍历
前中后遍历的基本解释
顺序的遍历是按照根节点的先后访问顺序制定的。
(根->左->右)前序遍历:首先访问根结点,然后遍历左子树,最后遍历右子树
(左->根->右)中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树
(左->右->根)后序遍历:首先遍历左子树,然后遍历右子树,最后访问根节点
链表代码解释前中后遍历和层次遍历
#!/usr/bin/env python # -*- encoding: utf-8 -*- # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right # # class Solution: # def preorderTraversal(self, root: TreeNode) -> List[int]: # # def PreOrder(self, root): # '''打印二叉树(先序)''' # if root == None: # return # print(root.val, end=' ') # self.PreOrder(root.left) # self.PreOrder(root.right) # # def InOrder(self, root): # '''中序打印''' # if root == None: # return # self.InOrder(root.left) # print(root.val, end=' ') # self.InOrder(root.right) # # def BackOrder(self, root): # '''后序打印''' # if root == None: # return # self.BacOrder(root.left) # self.BacOrder(root.right) # print(root.val, end=' ') class BinaryTreeNode(object): def __init__(self, data=None, left=None, right=None): self.data = data self.left = left self.right = right class BinaryTree(object): def __init__(self, root=None): self.root = root def is_empty(self): return self.root == None # 先序遍历 def preOrder(self, BinaryTreeNode): if BinaryTreeNode == None: return print(BinaryTreeNode.data, '\t', end='') self.preOrder(BinaryTreeNode.left) self.preOrder(BinaryTreeNode.right) # 中序遍历 def inOrder(self, BTNode): if BTNode == None: return self.inOrder(BTNode.left) print(BTNode.data, '\t', end='') self.inOrder(BTNode.right) # 后序遍历 def postOrder(self, BTNode): if BTNode == None: return self.postOrder(BTNode.left) self.postOrder(BTNode.right) print(BTNode.data, '\t', end='') # 层次遍历 def levelOrder(self, BinaryTreeNode): if BinaryTreeNode is None: return my_queue = [] node = BinaryTreeNode my_queue.append(node) while my_queue: node = my_queue.pop(0) print(node.data, '\t', end='') if node.left: my_queue.append(node.left) if node.right: my_queue.append(node.right) # # 层次遍历 # def levelOrder(self, BinaryTreeNode): # """ # :type BinaryTreeNode: TreeNode # :rtype: List[List[int]] # """ # # def helper(BinaryTreeNode, level): # if BinaryTreeNode == None: # return # else: # sol[level - 1].append(BinaryTreeNode.data) # if len(sol) == level: # 遍历到新层时,只有最左边的结点使得等式成立 # sol.append([]) # helper(BinaryTreeNode.left, level + 1) # helper(BinaryTreeNode.right, level + 1) # # sol = [[]] # helper(BinaryTreeNode, 1) # print(sol[:-1]) # for i in sol: # for j in i: # print(j, '\t', end='') if __name__ == '__main__': n001 = BinaryTreeNode(data='D') n002 = BinaryTreeNode(data='E') n003 = BinaryTreeNode(data='F') n004 = BinaryTreeNode(data='B', left=n001, right=n002) n005 = BinaryTreeNode(data='C', left=n003, right=None) root = BinaryTreeNode(data='A', left=n004, right=n005) obj = BinaryTree(root) print('层序遍历:') obj.levelOrder(obj.root) print('\n先序遍历:') obj.preOrder(obj.root) print('\n中序遍历:') obj.inOrder(obj.root) print('\n后序遍历:') obj.postOrder(obj.root) # 层序遍历: # A B C D E F # 先序遍历: # A B D E C F # 中序遍历: # D B E A F C # 后序遍历: # D E B F C A
数组的前中后遍历
参考以上的基础上 class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: def preorder(root: TreeNode): if not root: return res.append(root.val) preorder(root.left) preorder(root.right) res = list() preorder(root) return res
数组的层序遍历
二叉树的层序遍历:遍历每一层的结果取出来作为列表, 如下
原始: [3,9,20,null,null,15,7],
结果:[[3],[9,20],[15,7]]
思路: 一个队列(输入), 两个列表处理(一个总列表,一个临时列表)
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: if root is None: return res = [] my_queue = [root] while my_queue: current_layer_len = len(my_queue) layer = [] for _ in range(current_layer_len): cur_node = my_queue.pop(0) layer.append(cur_node.val) print(cur_node.val, '\t', end='') if cur_node.left: my_queue.append(cur_node.left) if cur_node.right: my_queue.append(cur_node.right) res.append(layer) return res
数组的中序遍历
中序迭代遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: res = [] stack, node = [], root if not root: return [] # 基本情况直接返回 while stack or node: while node: stack.append(node) # 先把节点放到栈里面 node = node.left # 看它有没有左分支,如果有,这个while循环会走到底 node = stack.pop() # 把根pop出来,把他的值放到list里面 res.append(node.val) node = node.right # 看他有没有右分支,然后重复 return res 递归遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: res = [] if not root: return [] # 基本情况直接返回 def check(node): if not node: return # 走到了根,返回 check(node.left) # 查看左边,直到走到根 res.append(node.val) # 把根值放进去 check(node.right) # 开始检查右边 check(root) return res
求二叉树的最大深度
class Solution: def maxDepth(self, root): if root is None: return 0 else: l = self.maxDepth(root.left) r = self.maxDepth(root.left) return max(l, r) + 1
翻转二叉树
class Solution: def invertTree(self, root: TreeNode) -> TreeNode: if not root: return root left = self.invertTree(root.left) right = self.invertTree(root.right) root.left, root.right = right, left return root