二叉树
二叉树的性质
性质1: 在二叉树的第i层上至多有2^(i-1)个结点(i>0)
性质2: 深度为k的二叉树至多有2^k - 1个结点(k>0)
性质3: 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
性质4:具有n个结点的完全二叉树的深度必为 log2(n+1)
性质5:对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1 时为根,除外)
二叉树的创建及节点表示
class Node:
def __init__(self, elem=-1, lchild=None, rchild=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
class Tree:
def __init__(self, root=None):
self.root = root
def add(self, elem):
node = Node(elem)
if self.root == None:
self.root = node
else:
queue = []
queue.append(self.root)
while queue:
cur = queue.pop(0)
if cur.lchild == None:
cur.lchild = node
return
elif cur.rchild == None:
cur.rchild = node
return
else:
queue.append(cur.lchild)
queue.append(cur.rchild)
二叉树的深度遍历和广度遍历
首先是深度优先遍历,又分成前、中、后三种遍历
#接前面的类代码,以下分别是前、中、后三种遍历
def preorder(self, root):
if root == None:
return
print(root.elem)
self.preorder(root.lchild)
self.preorder(root.rchild)
def inorder(self, root):
if root == None:
return
self.inorder(root.lchild)
print(root.elem)
self.inorder(root.rchild)
def postorder(self, root):
if root == None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print(root.elem)
广度优先遍历
从树的root开始,从上到下从从左到右遍历整个树的节点
需要利用队列
def breadth_travel(self, root):
if root == None:
return
queue = []
queue.append(root)
while queue:
node = queue.pop(0)
print node.elem,
if node.lchild != None:
queue.append(node.lchild)
if node.rchild != None:
queue.append(node.rchild)
由遍历顺序确定一棵树
有中序+前/后序遍历的结果可以确定,只有前序+后序不行
大致思路是,先从前或后序中确定根,根据中序遍历把树分成两个左右子树,再根据前后序确定左子树的根,根据中序再分成下一级左右子树,然后再一直进行下去,直到结束