利用python实现二叉树

树的基本概念

- 树的节点不能形成回路

- 森林是由多个数组成

树形结构的专有名词介绍

  • 度数:每一个节点的所有子树的个数
  • 层数:树的层数
  • 高度:树的最大层数
  • 树叶或终端节点:度数为零的节点
  • 父节点:与这个节点有链接的上一层节点
  • 子节点:每一个节点有链接的下一个节点
  • 祖先和子孙: 祖先:从树根到该节点路劲上所包含的节点;子孙:该节点往下追溯的任一节点
  • 兄弟节点: 有共同父节点的节点为兄弟节点
  • 非终端节点:树叶以外的节点
  • 同代:在同一棵树中具有相同层数的节点

二叉树

计算机存储树形结构一般是链表形式为主的。

定义:

* 二叉树最多只有两个子节点,每一个节点的度数小于等于2.

二叉树的特点:

  • 树不可以为空集
  • 树的度数为d>= 0 ,但二叉树的节点的度数 0 d 2 0\leqslant d \leqslant 2
  • 树的子树没有次序,二叉树有。左子树,右子树
  • 高度为k的二叉树的总结点树是$ 2^{k}-1$
  • 对于任意非空的二叉树T,如果 n 0 n_{0} 为树叶节点,且度数为2的节点数是 n 2 n_{2} , n 0 = n 2 + 1 n_{0} = n_{2} + 1
  • 在二叉树中,层数(Level)为i的节点数最多是 2 i 1 ( i 0 ) 2^{i-1}(i\geqslant0)

特殊的二叉树

满二叉树

  • 对于二叉树的高度为h,树的节点数为$ 2^{n} - 1$

完全二叉树

  • 如果二叉树的高度为h,树的节点数小于$ 2^{n} - 1$,编号方式与满二叉树相同,从上到下,从左到右。

斜二叉树

  • 一个二叉树完全没有左节点或者右节点

严格二叉树

  • 二叉树的每一个非终端节点都有左右子树。

二叉树的存储方式

一维数组表示法

  • 左子树的索引值是父节点的索引值 × 2 + 1 \times 2 + 1
  • 右子树的索引值是父节点的索引值 × 2 + 2 \times 2 + 2

二叉查找树

  • 每一个树根的值需要大于左子树的值
  • 每一个树根的值需要小于右子树的值
  • 左右子树也是二叉查找树
  • 树的每一个节点的值都不相同

建立一个二叉查找树

def Btree_create(btree,data,length):
    for i in range(length):
        level = 0
        while btree[level] != None:
            if data[i] > btree[level]:
                level = level * 2+2
            else:
                level = level = level*2+1
        btree[level] = data[i]
length = 8
data = [6,3,5,4,7,8,9,2]
btree = [None]*15
print('原始数组内容')
for i in range(length):
    print('[%2d]' % data[i],end = ' ')
print(' ')
Btree_create(btree,data,8)
print('二叉树内容:')
for i in range(15):
    print('[{}]'.format(btree[i]),end = ' ')
print()

        
原始数组内容
[ 6] [ 3] [ 5] [ 4] [ 7] [ 8] [ 9] [ 2]  
二叉树内容:
[6] [3] [7] [2] [5] [None] [8] [None] [None] [4] [None] [None] [None] [None] [9] 

二叉树的链表表示方法

#节点类
class tree:
    
    def __init__(self):
        self.data = 0
        self.left = None
        self.right = None

#以链表的方式建立二叉树
def create_tree(root,val): 
    newnode = tree()
    newnode.data = val
    newnode.left = None
    newnode.right = None
    if root == None:
        root = newnode
        return root
    else:
        current = root
        while current != None:
            backup = current
            if current.data > val
                current = current.left
            else:
                current = current.right
        if backup.data > val:
            backup.left = newnode
        else:
            backup.right = newnode
        return root
    

按照顺序输入一个二叉树有十个节点,分别是[5,6,24,8,12,3,17,1,9]

class tree:
    
    def __init__(self):
        self.data = 0
        self.left = None
        self.right = None

        
def create_tree(root,val): 
    newnode = tree()
    newnode.data = val
    newnode.left = None
    newnode.right = None
    if root == None:
        root = newnode
        return root
    else:
        current = root
        while current != None:
            backup = current
            if current.data > val:
                current = current.left
            else:
                current = current.right
        if backup.data > val:
            backup.left = newnode
        else:
            backup.right = newnode
        return root
    
data = [5,6,24,8,12,3,17,1,9]
ptr = None
root = None
for i in range(9):
    ptr = create_tree(ptr,data[i])

print('左子树')

root = ptr.left
while root != None:
    print('%d' % root.data)
    root = root.left
print('--------------------------------------')
print('右子树')
root = ptr.right

while root != None:
    print('%d' % root.data)
    root = root.right
print()

左子树
3
1
--------------------------------------
右子树
6
24

猜你喜欢

转载自blog.csdn.net/qq_20966795/article/details/84959630