二叉树的基本概念:
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)
二叉树的性质(特性)
性质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,item):
self.item = item
self.lchild = None # 左边
self.rchild = None # 右边
class Twotree(object):
def __init__(self,node=None):
self.root = node
def add(self,item):
if self.root is None:
self.root = Node(item)
else:
quere = []
quere.append(self.root)
while len(quere) > 0:
node = quere.pop(0)
if not node.lchild:
node.lchild = Node(item)
return
else:
quere.append(node.lchild)
if not node.rchild:
node.rchild = Node(item)
return
else:
quere.append(node.rchild)
def breadh_travel(self):
"""广度优先"""
if self.root is None:
return
quere = []
quere.append(self.root)
while len(quere) >0:
node = quere.pop(0)
print(node.item, end='')
if node.lchild:
quere.append((node.lchild))
if node.rchild:
quere.append((node.rchild))
def preorder_travel(self,root):
"""先序 根 左 右"""
if root:
print(root.item, end='')
self.preorder_travel(root.lchild)
self.preorder_travel(root.rchild)
def infir_travel(self,root):
"""中序, 左 根 右"""
if root:
self.infir_travel(root.lchild)
print(root.item, end="")
self.infir_travel(root.rchild)
def end_travel(self, root):
"""末序 左 右 根"""
if root:
self.end_travel(root.lchild)
self.end_travel(root.rchild)
print(root.item,end="")
if __name__ == '__main__':
tree = Twotree()
tree.add(0)
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.breadh_travel() # 层次遍历
print("")
tree.preorder_travel(tree.root) #
print('')
tree.infir_travel(tree.root)
print('')
tree.end_travel(tree.root)
0123456789
0137849256
7381940526
7839415620