1 # 定义节点 2 class TreeNode: 3 def __init__(self, x): 4 self.val = x 5 self.left = None 6 self.right = None 7 8 # 前序遍历(递归) 9 def preorder_rec(root): 10 res = [] 11 if not root: 12 return 13 #print(root.val) 14 res.append(root.val) 15 if root.left: 16 res.extend(preorder_rec(root.left)) 17 if root.right: 18 res.extend(preorder_rec(root.right)) 19 return res 20 21 # 前序遍历(迭代) 22 def preorder_iter(root): 23 if not root: 24 return 25 stack = [root] 26 res = [] 27 while stack: 28 s = stack.pop() 29 if s: 30 # print(s.val) 31 res.append(s.val) 32 stack.append(s.right) 33 stack.append(s.left) 34 return res 35 36 # 中序遍历(递归) 37 def inorder_rec(root): 38 if not root: 39 return 40 res = [] 41 if root.left: 42 res.extend(inorder_rec(root.left)) 43 res.append(root.val) 44 if root.right: 45 res.extend(inorder_rec(root.right)) 46 return res 47 48 # 中序遍历(迭代) 49 def inorder_iter(root): 50 if not root: 51 return 52 stack = [] 53 res = [] 54 while stack or root: 55 while root: 56 stack.append(root) 57 root = root.left 58 root = stack.pop() 59 res.append(root.val) 60 root = root.right 61 return res 62 63 # 后序遍历(递归) 64 def postorder_rec(root): 65 if not root: 66 return 67 res = [] 68 if root.left: 69 res.extend(postorder_rec(root.left)) 70 if root.right: 71 res.extend(postorder_rec(root.right)) 72 res.append(root.val) 73 return res 74 75 # 后序遍历(迭代) 76 def postorder_iter(root): 77 if not root: 78 return 79 stack = [] 80 res = [] 81 while stack or root: 82 while root: 83 stack.append(root) 84 if root.left: 85 root = root.left 86 else: 87 root = root.right 88 s = stack.pop() 89 res.append(s.val) 90 if stack and s == stack[-1].left: 91 root = stack[-1].right 92 else: 93 root = None 94 return res 95 96 # 层序遍历 97 def BFS(root): 98 if not root: 99 return 100 queue = [root] 101 res = [] 102 while queue: 103 q_len = len(queue) 104 for i in range(q_len): 105 q = queue.pop(0) 106 if q: 107 res.append(q.val) 108 queue.append(q.left if q.left else None) 109 queue.append(q.right if q.right else None) 110 return res 111 112 # 二叉树最大深度(递归) 113 def max_depth_rec(root): 114 if not root: 115 return 0 116 l = 1 + max_depth_rec(root.left) 117 r = 1 + max_depth_rec(root.right) 118 return max(l, r) 119 120 # 二叉树最大深度(迭代) 121 def max_depth_iter(root): 122 if not root: 123 return 124 stack = [] 125 if root: 126 stack.append((1, root)) 127 depth = 0 128 while stack: 129 cur_depth, root = stack.pop() 130 if root: 131 depth = cur_depth if cur_depth > depth else depth 132 stack.append((cur_depth+1, root.left)) 133 stack.append((cur_depth+1, root.right)) 134 return depth 135 136 # 二叉树最小深度(递归) 137 def min_depth_rec(root): 138 if not root: 139 return 0 140 if not root.left and not root.right: 141 return 1 142 if root.left and not root.right: 143 return 1 + min_depth_rec(root.left) 144 if not root.left and root.right: 145 return 1 + min_depth_rec(root.right) 146 else: 147 return 1 + min(min_depth_rec(root.left), min_depth_rec(root.right)) 148 149 # 二叉树最小深度(迭代) 150 def min_depth_iter(root): 151 if not root: 152 return 0 153 if not root.left and not root.right: 154 return 1 155 queue = [(1, root)] 156 while queue: 157 cur_depth, root = queue.pop(0) 158 if root.left == None and root.right == None: 159 return cur_depth 160 if root.left: 161 queue.append((cur_depth + 1, root.left)) 162 if root.right: 163 queue.append((cur_depth + 1, root.right)) 164 165 # 二叉树的所有路径 166 def traverse(root): 167 if not root: 168 return 169 if not root.left and not root.right: 170 return [str(root.val)] 171 left, right = [], [] 172 if root.left: 173 left = [str(root.val) + x for x in traverse(root.left)] 174 if root.right: 175 right = [str(root.val) + x for x in traverse(root.right)] 176 return left + right 177 178 if __name__ == ‘__main__‘: 179 nodelist = [TreeNode(i) for i in [4, 2, 7, 8, 3]] 180 nodelist[0].left = nodelist[1] 181 nodelist[0].right = nodelist[2] 182 nodelist[1].left = nodelist[3] 183 nodelist[1].right = nodelist[4] 184 root = nodelist[0] 185 #print(‘二叉树根节点为:‘, root) 186 print(‘前序遍历_递归:‘, preorder_rec(root)) 187 print(‘前序遍历_迭代:‘, preorder_iter(root)) 188 print(‘中序遍历_递归:‘, inorder_rec(root)) 189 print(‘中序遍历_迭代:‘, inorder_iter(root)) 190 print(‘后序遍历_递归:‘, postorder_rec(root)) 191 print(‘后序遍历_迭代:‘, postorder_iter(root)) 192 print(‘层次遍历:‘, BFS(root)) 193 print(‘最大深度_递归:‘, max_depth_rec(root)) 194 print(‘最大深度_迭代:‘, max_depth_iter(root)) 195 print(‘最小深度_递归:‘, min_depth_rec(root)) 196 print(‘最小深度_迭代:‘, min_depth_iter(root)) 197 print(‘所有路径:‘, traverse(root))
原文:https://www.cnblogs.com/xuebf/p/14273789.html