数据结构C实现——【树】(一)

一、树的结构与特点

1、树的组成

树是一种递归的数据类型,样子就像倒过来的树,组成如下:

        ①树根(root):树的顶端节点,通过链接/边指向所有子树

        ②子树

        ③链接/边(edges):比如指针或引用的方式建立链接

2、树的其他结构

        ①叶子(leaf):无子节点的末端节点

        ②一个节点相关的下属节点称为该节点的children
 

3、树的其他特点
        ①树右N个节点,就一定有N-1条边
        ②遍历一棵树是单向的,从树根开始到叶子结束
        ③同一层级的节点深度相同,所以根据节点的深度分为不同的层级。
4、树的高度与深度

节点X的深度:从根到节点X的路径长度

节点X的高度:从该节点到与一个叶子节点的最长路径(从上至下)

区别记忆:因为树是倒置结构,所以高度是从下往上,深度是从上往下

补充:

        ①树根的深度为0
        ②不存在的节点(孩)的深度为-1
        ③空树的高度 = -1

        ④叶子的高度 = 0

5、相关计算

设树的高度是h,节点数为n,最大层数是第i层

        ①最大节点数 n = 2^{0}2^{1}+...+2^{h} = 2^{h+1} - 1

        ②最小高度 h = log2(n+1) - 1 = 【log2 (n)】向下取整

        ③最大高度 h = n - 1  (稀疏树:只有一个孩)

6、时间复杂度

        ①完全/完美二叉树:O( log2(n) )

        ②稀疏树:O(n)

二、二叉树

1、定义

二叉树:每个节点最多只有两个子节点(children),分别称为左孩、右孩

2、分类

        ①严格二叉树:不超过两孩

        ②完全二叉树:除了最后一层外其他层的节点都完全填充(图1)

        ③完美二叉树:所有节点左对齐的完全二叉树(左边没有空节点)(图2)

        ④平衡二叉树:每个节点的左孩和右孩的高度差不超过k=1

        ⑤空树:没有节点

3、二叉树的子树

子树的高度 = 左孩与右孩的高度差

上图:左孩的高度是1,右孩(不存在的孩)高度为-1,所以该子树的高度是2
 

4、创建二叉树

方法:创建动态节点,使用指针引用将节点链接起来

特殊:用数组创建完美二叉树

三、二叉搜索树

1、特点

①所有节点的左孩(左子树)的值比该节点的值小(左孩更小)

②所有节点的右孩(右子树)的值比该节点的值大(右孩更大)

③搜索、插入、删除的时间复杂度最小,都是O ( log2n )

④二叉搜索树必须是平衡二叉树

(这种像链表一样的二叉树也可以是二叉搜索树)

2、二分法搜索

思路:通过不断与段落中点进行比较来缩小范围,较小则取段落中点以左的段,较大则取段落中点以右的段。

举例:

 确定段落端点

 取区间中点

 10比15小所以取8-12这段

 再取区间中点,重复以上步骤。

二分查找法的运算时间(时间复杂度)是O ( log2(n) )

3、用二叉搜索树进行搜索

原理:二叉树搜索其实就是二分查找,也是通过比较来缩小范围。当二叉搜索时是完美二叉树时,其时间复杂度就是O ( log2(n) )
需要注意的是,左子树下最大的值也不会大于该节点的值,同理,右子树下最小的值也不会小于该节点的值

举例:

从根节点开始比较,路线是15→10→12,因为12一定存在于根节点的左子树范围内,同时也一定在10的右子树范围内。

3、在二叉搜索树中插入 

同理也是先进行比较来确定范围,直到最后一个相近的节点。如果插入的值比它小就成为它的左孩,比它大就是右孩。

4、删除二叉搜索树的节点

先搜索再删除,所以时间复杂度和搜索时相同。

注:插入和删除都容易让二叉搜索树变得不平衡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值