一、基本概念
每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。
性质:
1、非空二叉树的第n层上至多有2^(n-1)个元素。
2、深度为h的二叉树至多有2^h-1个结点。
满二叉树:所有终端都在同一层次,且非终端结点的度数为2。
在满二叉树中若其深度为h,则其所包含的结点数必为2^h-1。
完全二叉树:除了最大的层次即成为一颗满二叉树且层次最大那层所有的结点均向左靠齐,即集中在左面的位置上,不能有空位置。
对于完全二叉树,设一个结点为i则其父节点为i/2,2i为左子节点,2i+1为右子节点。
如这样一个二叉树:
它的前序遍历顺序为:ABDGHCEIF(规则是先是根结点,再前序遍历左子树,再前序遍历右子树)
它的中序遍历顺序为:GDHBAEICF(规则是先中序遍历左子树,再是根结点,再是中序遍历右子树)
它的后序遍历顺序为:GHDBIEFCA(规则是先后序遍历左子树,再是后序遍历右子树,再是根结点)
class Node(object): def __init__(self,item): self.elem = 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 breath_travel(self): """广度遍历""" if self.root is None: return queue = [self.root] while queue: cur_node = queue.pop(0) print(cur_node.elem,end=' ') if cur_node.lchild is not None: queue.append(cur_node.lchild) if cur_node.rchild is not None: queue.append(cur_node.rchild) def preorder(self,node): '''前序遍历''' if node is None: return print(node.elem,end=' ') self.preorder(node.lchild) self.preorder(node.rchild) def inorder(self,node): '''中序遍历''' if node is None: return self.inorder(node.lchild) print(node.elem,end=' ') self.inorder(node.rchild) def postorder(self,node): '''后序遍历''' if node is None: return self.postorder(node.lchild) self.postorder(node.rchild) print(node.elem,end=' ') if __name__ == "__main__": tree = Tree() tree.add(1) tree.add(2) tree.add(3) tree.add(4) tree.add(5) tree.add(6) tree.add(7) tree.add(8) tree.add(9) tree.breath_travel() print(' ') tree.preorder(tree.root) print(' ') tree.inorder(tree.root) print(' ') tree.postorder(tree.root)