树的详解及python实现

1.树不是线性结构,是非线性的。
2.树在计算机科学里应用广泛,包括操作系统,图形学,数据库和计算机网络等。
3.数的术语:

·节点
	· 树中的每一个元素称为一个节点,节点是树的基本组成部分。
· 边
	· 边也是树的基本构成部分,边有方向,连接两节节点,并表示他们之间的联系。
	· 除了根节点外每个节点都有且有一条与其他节点相连的入边,每个节点有多个出边
· 根节点
	· 根节点是树中唯一一个没有入边的节点

4.树的定义:

树是节点和连接节点的边的集合,它有以下特征:
	·有一个根节点
	·除了根节点,每一个节点都有一条边与父节点相连
	·可以沿着唯一的路径从根节点到每个节点
	·如果这个树的每个节点都有至多两个子节点,称为二叉树

5.二叉树的定义:

· 二叉树是由n(n>=0)个节点组成的有限集合,每个节点最多有两个子树,它或者是空集,或者是由一个根和左右的两个不相交的二叉树组成
· 节点的度和树的度
	· 每个节点具有的子树个数叫节点的度,所有节点的度的最大值称为树的度
· 二叉树的度为2

6.二叉树的特点:

· 二叉树是有序树,即使只有一个子树,也必须区分左右子树
· 二叉树的每个节点的度不能大于2
· 二叉树中所有节点的形态有5种:空节点,无左右子树的节点,只有左子树的节点,只有右子树,左右子树都有

7.满二叉树是完全二叉树的特例
8.二叉树的遍历:

· 按照一定次序访问树中所有节点,并且每个节点的值仅被访问一次的过程
· 可能的三种遍历次序:
	· 先序遍历: VLR
	· 中序遍历: LVR
	· 后序遍历: LRV

9.列表实现二叉树的遍历:

mytree = [
    'a',
    ['b',
     ['d',[],[]],
     ['e',[],[]],
     ],
    ['c',
     ['f',[],[]],
     [],
     ]
]
print('root=',mytree[0])
print('left tree=',mytree[1])
print('right tree=',mytree[2])
结果:
root= a
left tree= ['b', ['d', [], []], ['e', [], []]]
right tree= ['c', ['f', [], []], []]

10.构建二叉树代码实现:

def bin_tree(r):
    return [r,[],[]]

def insert_left(root,new_brach):
    t = root.pop(1)
    if len(t) > 1:
        root.insert(1,[new_brach,t,[]])
    else:
        root.insert(1,[new_brach,[],[]])
    return root

def insert_right(root,new_brach):
    t = root.pop(2)
    if len(t) > 1:
        root.insrt(2,[new_brach,[],t])
    else:
        root.insert(2,[new_brach,[],[]])
    return root

def get_root(root):
    return root[0]

def set_root(root,new_root):
    root[0] = new_root

def get_left_tree(root):
    return root[1]

def get_right_left(root):
    return root[2]

tree = bin_tree('a')
insert_left(tree,'b')
insert_right(tree,'c')
insert_left(get_left_tree(tree),'d')
insert_right(get_left_tree(tree),'e')
insert_left(get_right_left(tree),'f')
print(tree)
结果:
['a', ['b', ['d', [], []], ['e', [], []]], ['c', ['f', [], []], []]]

11.二叉树的先序遍历

def func_vlr(tree):
    if tree != []:
        print(tree[0],end='')
        func_vlr(tree[1])
        func_vlr(tree[2])
func_vlr(tree)

12.二叉树的中序遍历

def func_lvr(tree):
    if tree != []:
        func_lvr(tree[1])
        print(tree[0],end='')
        func_lvr(tree[2])
func_lvr(tree)    

13.计算二叉树节点的个数

def count_func(tree):
    if tree == []:
        return 0
    n1 = count_func(tree[1])
    n2 = count_func(tree[2])
    res = 1+n1+n2
    return res
print(count_func(tree))

14.二叉排序树的定义:

· 要么是一颗空树
· 如果不为空,那么其左子树节点的值都小于根节点的值,右子节点的值都大于根节点的值
· 左右子树也是二叉排序树

15.判断二叉树中是否有某个数

def serach_tree(tree,num):
    if tree == []:
        return False
    if num == tree[0]:
        return True
    elif num < tree[0]:
        return serach_tree(tree[1],num)
    elif num > tree[0]:
        return serach_tree(tree[2],num)

16.二叉树插入一个数:

def insert_tree(tree,num):
    if tree == []:
        tree.extend([num,[],[]])
    elif num <=tree[0]:
        insert_tree(tree[1],num)
    elif num > tree[0]:
        insert_tree(tree[2],num)

17.查找二叉搜索树的最大值:

def getmax(tree):
    if tree[2] ==[]:
        x = tree[0]
        if tree[1] != []:
            tree[:] = tree[1]
        else:
            tree.clear()
        return x
    else:
        return getmax(tree[2])

18.二叉搜索树删除一个数

def delete(tree,num):
    if tree == []:
        return False
    if num < tree[0]:
        return delete(tree[1],num)
    elif num > tree[0]:
        return delete(tree[2],num)
    else:
        if tree[1] == [] and tree[2] == []:
            tree.clear()
        elif tree[1] == []:
            tree[:] = tree[2]
        elif tree[2] == []
            tree[:] = tree[1]
        else:
            max = getmax(tree[1])
            tree[0] = max
        return True

猜你喜欢

转载自blog.csdn.net/weixin_43697214/article/details/114417435