树的定义/性质/实现

一种层次数据结构:很多时候在管理上比线性表更为高效。

1.树的定义:由有限个节点以树的连接方式的集合:有一个唯一的根节点,若干个子树,其中每一个子树也有唯一的根节点,这个根节点下又分为若干的子树的递归定义

2. 有关树的基本术语:

节点的度  树的度 根节点 叶节点 分支节点 父节点 子节点 兄弟节点 子孙节点 祖先节点 节点的层次(根节点层次是1) 路径  路径长度 树的深度

3. 二叉树的定义:由根节点和左右子树构成,左右子树分别又是一个二叉树的递归定义

4.完美二叉树(满二叉树):

定义一(国外):一个二叉树中除了叶节点;其余节点的度数均为2

定义二(国内):在定义一的基础上,最后一层都布满了叶子节点,称为满二叉树

5. 完全二叉树:在满二叉树的基础上,可以连续删除掉最末尾几个元素

完全二叉树

6. 二叉树的重要性质

① 二叉树的第i(i=1,2,3...)层最多有2^(i-1)个节点; 一个k层的二叉树的总节点不多于 2^(k)-1个。

② n0=n2+1 :度数为0的节点是度数为2的节点的数量+1

7.二叉树的两种实现方式

1.利用 [ ] 来实现

''' 本模块不是封闭的模块;所以不可以被别的模块调用
这里提供几个本模块的接口'''
# 二叉树实例,作为输入

btree = ['A', ['B', None, None],
      ['C', ['D', ['F', None, None],
            ['G', None, None]]]]
#####################


def bintree(data, left=None, right=None): # 为了操作二叉树定义递归的基本框架
    return [data, left, right]


def is_empty(btree):
    return btree is None


def root(tree):
    return tree[0]


def left(tree):
    return tree[1]


def right(tree):
    return tree[2]


def set_root(tree, data):
    tree[0] = data


def set_left(tree, left):
    tree[1] = left


def set_right(tree, right):
    tree[2] = right
##########################
# 这里是实例操作的示例:


# 1 判断二叉树是否空:
ans=is_empty(btree)
print("这个二叉树是否空",ans)

# 2 找到这个二叉树的根
ans = root(btree)
print("这个二叉树的根是", ans)

# 3 把这个二叉树的右子树设置成为别的子树
print("设置了右子树之前", btree)

set_right(btree, bintree(100, bintree(200), 300))

print("设置了右子树之后", btree)

2. 以连接节点为基础构成的二叉树

'''基于链表节点的二叉树类实现
注意:这里的节点是封闭的但是,相关树的操作不是
封闭的
该模块提供的接口有:
1. 查看树的节点个数

2.如果全部节点内容是数值,可以求所有节点数值的和

'''
# 节点类


class BinTree:
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right


# 操作函数
def count_Note(btree):
    if btree == None:
        return 0
    else:  # 递归求解
        return 1 + count_Note(btree.left)\
                  + count_Note(btree.right)


def sum_Note(btree):
    if btree==None:
        return 0
    else:
        return btree.data+sum_Note(btree.left)\
               +sum_Note(btree.right)

############################
# 操作示例
# 这里一定要注意的是:最小单元不可以是单个数字
#btree=BinTree(1,BinTree(2,3),BinTree(5,BinTree(6,9)))


btree=BinTree(1, BinTree(2, BinTree(3)), BinTree(5, BinTree(6, BinTree(9))))

print("节点的个数是:%d"%count_Note(btree))

print("节点的内容和是:%d"%sum_Note(btree))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值