Achieve binary tree (supplement)
The binary tree comprises a binary tree to realize preorder traversal, in order traversal and postorder traversal sequence and the binary tree, further comprising a binary tree height, and inverted binary tree leaf nodes
The binary tree traversal sequence is still implemented in Python deque a queue is built, according to the nature of the FIFO queue (FIFO), the root node of the binary tree first in the queue, it is determined whether the queue is empty, if not empty, then Pops an element, to print the value of the element, if the element has left the child, put the child into the team left, the right if there is a child, have a child put into the team
Code:
. 1 from Collections Import deque 2 . 3 . 4 class Queue: # With built deque we can quickly implement a Queue . 5 DEF the __init__ (Self): . 6 self._elem = deque () . 7 . 8 DEF the append (Self, value): . 9 return Self ._elem.append (value) 10 . 11 DEF POP (Self): 12 is return self._elem.popleft () 13 is 14 DEF empty (Self): 15 return len (self._elem) == 0 16 17 18 class BTree(object): 19 def __init__(self, data=None, left=None, right=None): 20 self.data = data 21 self.left = left 22 self.right = right 23 24 def preorder(self): 25 if self.data is not None: 26 print(self.data, end=',') 27 if self.left is not None: 28 self.left.preorder() 29 if self.right is not None: 30 self.right.preorder() 31 32 def midorder(self): 33 if self.left is not None: 34 self.left.midorder() 35 if self.data is not None: 36 print(self.data, end=',') 37 if self.right is not None: 38 self.right.midorder() 39 40 DEF postorder (Self): 41 is IF self.left IS Not None: 42 is self.left.postorder () 43 is IF self.right IS Not None: 44 is self.right.postorder () 45 IF self.data IS Not None : 46 is Print (self.data, End = ' , ' ) 47 48 DEF levelorder (Self): 49 50 # returns the left child of a node 51 is DEFLChild_Of_Node (the Node): 52 return node.left IF node.left IS not None the else None 53 54 # Returns the right child of a node 55 DEF RChild_Of_Node (the Node): 56 return node.right IF node.right IS not None the else None 57 is 58 # sEQUENCE traversal list 59 level_order = [] 60 # whether to add the data in the root node 61 is iF self.data iS Not None: 62 is level_order.append ([Self]) 63 is 64 # binary tree height 65 height = self.height () 66 IF height> =. 1 : 67 # of the second layer and subsequent layers is operated, the node is added in level_order not the data 68 for _ in Range (2, + height. 1 ): 69 Level = [] # of the node layer 70 for node in level_order [-1 ]: 71 is # If the left child is not empty, the left child added 72 IF LChild_Of_Node (Node): 73 is level.append (LChild_Of_Node (Node)) 74 # If not empty right child, right child is added 75 IF RChild_Of_Node (Node): 76 level.append (RChild_Of_Node (Node)) 77 # If the layer is non-empty, then add the layer 78 IF Level: 79 level_order.append (Level) 80 81 # extracted data in each layer 82 for I in Range (0, height): # layers 83 for index in Range (len (level_order [I])): 84 level_order [i] [index] = level_order[i][index].data 85 86 return level_order 87 88 def height(self): 89 if self.data is None: 90 return 0 91 elif self.left is None and self.right is None: 92 return 1 93 elif self.left is None and self.right is not None: 94 return 1 + self.left.height() 95 elif self.left is not None and self.right is None: 96 return 1 + self.left.height() 97 else: 98 return 1 + max(self.left.height(), self.right.height()) 99 100 def leaves(self): 101 if self.data is None: 102 return None 103 elif self.left is None and self.right is None: 104 print(self.data, end=',') 105 elif self.left is None and self.right is not None: 106 self.right.leaves() 107 elif self.left is not None and self.right is None: 108 self.left.leaves() 109 else: 110 self.left.leaves() 111 self.right.leaves() 112 113 # 反转二叉树 114 def reverse(self): 115 if self.data is not None: 116 if self.left and self.right: 117 self.left, self.right = self.right, self.left 118 self.left.reverse() 119 self.right.reverse() 120 121 # @staticmethod 122 # def layer_trav(subtree): 123 # cur_nodes = [subtree] # current layer nodes 124 # next_nodes = [] 125 # while cur_nodes or next_nodes: 126 # for node in cur_nodes: 127 # print(node.data, end=',') 128 # if node.left: 129 # next_nodes.append(node.left) 130 # if node.right: 131 # next_nodes.append(node.right) 132 # cur_nodes = next_nodes # 继续遍历下一层 133 # next_nodes = [] 134 135 @staticmethod 136 def layer_trav(subtree): 137 q = Queue() 138 q.append(subtree) 139 while not q.empty(): 140 node = q.pop() 141 print(node.data, end=',') 142 if node.left: 143 q.append(node.left) 144 if node.right: 145 q.append(node.right) 146 147 148 if __name__ == '__main__': 149 right_tree = BTree(6) 150 right_tree.left = BTree(2) 151 right_tree.right = BTree(4) 152 153 left_tree = BTree(5) 154 left_tree.left = BTree(1) 155 left_tree.right = BTree(3) 156 157 tree = BTree(11) 158 tree.left = left_tree 159 tree.right = right_tree 160 161 left_tree = BTree(7) 162 left_tree.left = BTree(3) 163 left_tree.right = BTree(4) 164 165 right_tree = tree # 增加新的变量 166 tree = BTree(18) 167 = tree.left left_tree 168 tree.right = right_tree 169 tree.root = Tree 170. 171 is Print ( ' preorder as: ' ) 172 tree.preorder () 173 Print ( ' \ n- ' ) 174 175 Print ( ' subsequent traversal of: ' ) 176 tree.postorder () 177 Print ( ' \ n- ' ) 178 179 Print ( ' preorder as:' ) 180 [ tree.midorder () 181 Print ( ' \ n- ' ) 182 183 is Print ( ' sequence of traversal: ' ) 184 level_order = tree.levelorder () 185 tree.layer_trav (Tree) 186 Print ( ' \ n- ' ) 187 Print (level_order) 188 189 Print ( ' leaf node: ' ) 190 tree.leaves () 191 Print ( '\ n- ' ) 192 193 Print ( ' height of the tree is: ' ) 194 Print (tree.height ()) 195 Print ( ' \ n- ' ) 196 197 Print ( ' inverted binary ' ) 198 tree.reverse () 199 Print ( ' preorder ' ) 200 is tree.preorder () 201 Print ( ' \ n- ' ) 202 Print ( ' layer preorder') 203 tree.layer_trav(tree)