二叉树添加元素与遍历(Python版)
class Node(object): def __init__(self,item): self.item = item self.lchild = None self.rchild = None class Tree(object): def __init__(self): self.root = None def add(self,item): node = Node(item) #新建一个队列用来临时存放树的节点数据 if self.root is None: self.root = node return queue = [self.root] while queue: cur_node = queue.pop(0) #取队列第一个元素,是因为树添加元素的时候,是广度遍历寻找空位 #从上到下,从左到右,每一次寻找空位的时候都是队列最前面元素开始找 #如果该元素的左右孩子皆有,将其添加到队列尾部,继续取第一个元素找。 #该算法用队列最好了 if cur_node.lchild is None: cur_node.lchild = node return else: queue.append(cur_node.lchild) if cur_node.rchild is None: cur_node.rchild = node return else: queue.append(cur_node.rchild) def breadth_travel(self): """广度遍历""" if self.root is None: return queue = [self.root] while queue: cur_node = queue.pop(0) print(cur_node.item,end=" ") if cur_node.lchild: queue.append(cur_node.lchild) if cur_node.rchild: queue.append(cur_node.rchild) def preorder(self,node): """先序遍历""" if node is None: return print(node.item,end=" ") self.preorder(node.lchild) self.preorder(node.rchild) def inorder(self,node): """中序遍历""" if node is None: return #先处理左边的,再处理中间,然后处理后边的 self.inorder(node.lchild) print(node.item,end=" ") self.inorder(node.rchild) def postorder(self,node): """后序遍历""" if node is None: return # 先处理左边的,再处理右边,然后处理中间的 self.postorder(node.lchild) self.postorder(node.rchild) print(node.item,end=" ") if __name__ == __main__: tree = Tree() for i in range(10): tree.add(i) print("breadth_tarvel:",end="") tree.breadth_travel() print() print("preoder:",end="") tree.preorder(tree.root) print() print("inorder:",end="") tree.inorder(tree.root) print() print("postorder:",end="") tree.postorder(tree.root)
执行结果:
breadth_tarvel:0 1 2 3 4 5 6 7 8 9 preoder:0 1 3 7 8 4 9 2 5 6 inorder:7 3 8 1 9 4 0 5 2 6 postorder:7 8 3 9 4 1 5 6 2 0