树的实现和二叉树的定义

为了实现树,树中的每一个节点除数据外还要有一些指针,使得该节点的每一个孩子节点都有一个指针指向它。实际中由于树中某个节点的孩子节点数可以变化很大且事先不知道,故在树的数据结构中建立到各孩子节点直接的链接是不可行的(假如这样做会产生太多的浪费空间)。

  实际上比较简单的做法:将树中每个节点的所有孩子节点都放在树节点的链表中。具体声明如下:

typedef struct TreeNode *PtrToNode;

struct TreeNode
{
    ElementType Element;
    PtrToNode FirstChild;
    PtrToNode NextSibling;
}

下图的树结构中,向下的箭头是指向某个节点的FirstChild(第一孩子)的指针,从左到右的箭头是指向该节点的NextSibling(下一兄弟)的指针。因为空指针太多,故没有把它们画出来。

这里写图片描述

在上图中,节点C有一个指针(NextSibling)指向兄弟节点E,另一个指针(FirstChild)指向孩子节点D;有些节点(如D、H、K和M等)这两种指针均没有。

树有很多应用,比较广泛流行的用法是包括UNIX、VAX/VMS和DOS等常用操作系统中的目录结构

二叉树(binary tree)是一棵树,其中每个节点都不能有多于2个的孩子(子树),且二叉树节点的孩子(子树)有左右之分,次序不能颠倒。由此定义可知在二叉树中不存在度【某个节点拥有的孩子(子树)的数目】大于2的节点。

这里写图片描述

二叉树的平均深度要比N(树的总节点数)小很多,这个平均深度为O(sqrt(N)),最大深度可以大到(N-1)。

通常采用链式存储二叉链表和顺序存储数组这2种方法来存储二叉树,其中二叉链表法因为灵活、方便操作的特点而被经常使用。二叉树的二叉链表存储结构如下代码和图所示:

typedef struct BinaryTreeNode *PtrToNode;
typedef struct PtrToNode Tree;

struct BinaryTreeNode
{
    ElementType Element;
    Tree        Left;
    Tree        Right;
};

______________________________

typedef struct BinaryTreeNode
{
    ElementType Element;
    struct BinaryTreeNode *Left;
    struct BinaryTreeNode *Right;
}BinaryTreeNode,*BinaryTree;
        
        二叉树节点声明

对应举例说明二叉树的二叉链表存储过程

这里写图片描述

二叉树的性质:
(1)在二叉树中的第i层上至多有2^(i-1)个节点(i≥1);
(2)层数(有说深度的)为k的二叉树至多有2^k-1个节点(k≥1);
(3)对任何一棵二叉树T,如果其终端节点(度为0)的数目为n0,度为2的节点数目为n2,则n0=n2+1

满二叉树:层数为k且具有2^k-1个节点的二叉树,即满二叉树中的每一层上的节点数都是最大的节点数,所有终端都在同一个层次,且非终端节点的度都为2;
完全二叉树:层数为k且具有n个节点的二叉树,当且仅当每一个节点与层数为k的满二叉树中的编号从1至n的节点一一对应;对于完全二叉树,设某个节点的编号为i,则其父节点的编号为floor(i/2),2*i为它的左子节点,(2*i+1)为它的右子节点。

结论:满二叉树和完全二叉树是2种特殊形态的二叉树,满二叉树肯定是完全二叉树,但完全二叉树不一定是满二叉树。

这里写图片描述

(4)具有n个节点的完全二叉树的层数(最大层次)为floor(log2(n))+1 。【floor()函数向下取整】

二叉搜索(查找)树(binary search tree),也称有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),它是指一棵空树或者具有下列性质的二叉树:

(1)若任意节点的左子树不空,则它的左子树上所有节点的元素值均小于该节点的元素值;
(2)若任意节点的右子树不空,则它的右子树上所有节点的元素值均大于该节点的元素值;
(3)任意节点的左、右子树也分别为二叉搜索树;
(4)没有键值相等的某2个节点。

这里写图片描述

二叉搜索树的优势在于查找、插入的时间复杂度较低,为O(log(n))【n为树的总节点数】;二叉查找树可以用来构建诸如集合、multiset和关联数组等。

参考资料

1.《算法导论》读书笔记之第10章 基本数据结构之二叉树

2.浅谈算法和数据结构(7)

3.轻松搞定面试中的二叉树题目

4.二叉搜索树-维基百科

5.数据结构与算法分析-C语言描述【书籍】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉排序(Binary Search Tree,简称BST)是一种特殊的二叉树,其中每个节点的左子中的所有键值小于节点的键值,右子中的所有键值大于节点的键值。这个特性使得二叉排序可以快速地进行搜索、插入和删除操作。 平衡二叉树(Balanced Binary Tree)是一种特殊的二叉排序,它的左子和右子的高度之差的绝对值小于等于1。这个特性可以使得平衡二叉树的高度保持在一个较小的范围内,从而提高了搜索、插入和删除操作的效率。 实现二叉排序的算法通常包括插入、搜索和删除操作。当需要插入一个新的节点时,我们首先搜索中的位置,然后将新节点插入到正确的位置上,保持二叉排序的特性。搜索操作通过比较节点的键值和目标值来决定向左子还是右子搜索。删除操作需要考虑多种情况,包括删除的节点是叶子节点、删除的节点只有一个子节点、删除的节点有两个子节点等。具体的算法实现可以根据需要进行调整和优化。 实现平衡二叉树的算法通常包括插入、搜索和删除操作,同时还需要进行平衡因子的计算和的调整。在插入过程中,我们首先按照二叉排序的规则插入新节点,然后计算每个节点的平衡因子,根据平衡因子的大小来进行的旋转操作,以保持的平衡性。具体的算法实现可以根据不同的平衡因子定义和旋转规则进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [二叉排序、二叉平衡算法](https://blog.csdn.net/shenwansan_gz/article/details/41516127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [二叉排序和二叉平衡](https://blog.csdn.net/weixin_43829058/article/details/126978715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值