文章目录

  • 1 树的基本概念
    • 1.1 树的形式定义
    • 1.2 树的递归定义
    • 1.3 树的基本术语
    • 1.4 二叉树的递归定义
    • 1.5 存储方法
    • 1.6 满二叉树VS完全二叉树
  • 2 二叉树的性质
  • 3 代码实现

1 树的基本概念

1.1 树的形式定义

T={D,R}

  • D为树T中包含n个结点的有限集合,R为树中结点之间关系的集合。
  • 当n=0时,树为空树;当n>0时,R是D上某个二元关系的集合,满足以下条件:
  • 有且仅有一个结点,称为根结点,该结点没有直接前驱结点;
  • 除根结点外,每个结点有且仅有一个前驱结点;
  • D中每个结点可以有零个或多个后继结点;
1.2 树的递归定义
  • 树是由n(n≥0)个结点组成的有限集T。
  • 当n=0时,它是一个空树;当n>0时,它满足两个条件:
  • 有且仅有一个特定的结点,称为根结点。
  • 除根结点以外的其余结点分为m个(m≥0)互不相交的有限集T1、T2、……Tm,其中每个集合又都是一棵树,称T1、T2、……Tm为根结点的子树。
1.3 树的基本术语
  1. 结点:树的数据元素
  2. 结点的度:该结点的分支的个数
  3. 树的度:树中所有结点的度的最大值
  4. 结点的层次:从根到该结点的层数(根结点算第一层)
  5. 树的深度:所有结点的层次的最大值
  6. 根结点:在非空树中,无前驱结点的结点
  7. 分支结点:度不为0的结点
  8. 叶结点:度为0的结点
  9. 孩子结点:结点的子树的根
  10. 双亲结点:孩子结点的根结点
  11. 兄弟结点:具有共同双亲的结点
  12. 堂兄弟结点:双亲互为兄弟的结点
  13. 祖先结点:从根到该结点的所经历的所有结点
  14. 子孙结点:以某结点为根的子树中的任一结点
1.4 二叉树的递归定义

二叉树是结点的有限集合,这个有限集,或为空集,或由一个根结点及两棵互不相交的,分别叫作这个根的左子树和右子树的二叉树组成。

【注意】二叉树不是树的特殊情况。

1.5 存储方法

双亲表示法——求父结点方便
孩子表示法——求子结点方便
双亲孩子表示法—求父结点和子结点方便
二叉树表示法——把一个普通树转化成二叉树来存储

1.6 满二叉树VS完全二叉树

满二叉树

  • 定义:深为k且有2k−12^k-12k−1个结点的二叉树。
  • 编号:约定编号从根开始,自上而下,自左而右,给二叉树中的每个结点一个从1开始的连续的编号。

完全二叉树

  • 定义:深为k且有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。

满二叉树是完全二叉树,反之则不一定!

2 二叉树的性质

  1. 在二叉树的第 i 层上至多有 2i−12^{i-1}2i−1个结点 (i≥1i\geq1i≥1)

证明:
(1)i=1时,只有一个根结点,2i−12^{i-1}2i−1 =202^020= 1,结论正确;
(2)假设n=k-1命题成立,即第k-1层上至多有 2k−22^{k-2}2k−2 个结点,则当n=k时,每个结点至多有两棵子树;
k层结点最多为k-1层的2倍,故s<=2∗2k−2=2k−1s<=2*2^{k-2}=2^{k-1}s<=2∗2k−2=2k−1,第i层至多有 2i−12^{i-1}2i−1 个结点;
(3)由归纳法,即得证。


  1. 深度为 k 的二叉树至多有2k−12^k-12k−1个节点(k≥1k\geq1k≥1)

20+21+…+2k-1=2k-1(利用等比数列求和公式得到结果)


  1. 对任何一颗二叉树 T,如果其终端结点树为 n0n_0n0​,度为 2 的结点数为 n2n_2n2​,则 n0n_0n0​ = n2n_2n2​+1

证明:
终端结点数就是叶结点数了,而一颗二叉树,除了叶结点外,剩下的就是度为 12 的结点数了,我们设 n1n_1n1​ 为度是 1 的结点数,则树 T 的总结点数为

n = n0n_0n0​ + n1n_1n1​ + n2n_2n2​

再换一个角度,数一下二叉树中连接线的总数,由于根节点没有双亲,所以一个二叉树中,连接线数等于结点树-1,n1n_1n1​ 的度为 1 所以它仅有一条连接线,n2n_2n2​同理,代数表达式就是

n−1n-1n−1 = n1n_1n1​ +2n22n_22n2​

再结合等式

n = n0n_0n0​ + n1n_1n1​ + n2n_2n2​

推导出

n0n_0n0​ + n1n_1n1​ + n2n_2n2​-1 = n1n_1n1​ + 2n22n_22n2​

所以:

n0n_0n0​ = n2n_2n2​ + 1


  1. 具有 n 个结点的完全二叉树的深度为 [log⁡2n][\log_2 n][log2​n] + 1 ,([x]代表不大于 x 的最大整数)

证明:
1)对于满二叉树,深度为 k 的满二叉树至多有2k−12^k-12k−1个节点(k≥1k\geq1k≥1)
那么由:

n=2k−1n=2^k-1n=2k−1

可以倒推

k=log⁡2(n+1)k=\log_2(n+1)k=log2​(n+1)

2)对于完全二叉树,它的结点数一定少于等于同样深度的满二叉树 2k−12^k-12k−1,但一定多于 2i−1−12^{i-1}-12i−1−1,即:

2i−1−1<n≤2k−12^{i-1}-1<n\leq2^k-12i−1−1<n≤2k−1

所以

2i−1≤n<2k2^{i-1}\leq n < 2^k2i−1≤n<2k

两边取对数:

2i−1≤n<2k2^{i-1}\leq n < 2^k2i−1≤n<2k

k 又是整数:

k=[log⁡2n]+1k = [\log_2 n] + 1k=[log2​n]+1


  1. 对于一个有 n 个结点的完全二叉树(或满二叉树)的结点按层序顺序从左到右编号,对任意结点 i 有:

1)如果 i = 1,那么结点 i 为该树的根,无双亲;若 i > 1 ,则其双亲是结点 [i/2]
2)如果 2i > n,则结点无左孩子(结点 i 为叶子结点),否则其左孩子结点是 2i
3)如果 2i + 1 > n,则结点 i 无右孩子,否则其右孩子是结点 2i + 1

3 代码实现

创建二叉树:

#include <stdio.h>
#include <stdlib.h>typedef char ElementType;
typedef struct Binary {ElementType data;struct Binary *lchild;struct Binary *rchild;
} *BinaryTree;/* Recursive implementation 1 */
BinaryTree CreateBinaryTree_1(void)
{BinaryTree bt;char ch;scanf("%c", &ch);if (ch == '#') {bt = NULL;} else {bt = (BinaryTree)malloc(sizeof(struct Binary));bt->data = ch;bt->lchild = CreateBinaryTree_1();bt->rchild = CreateBinaryTree_1();}return bt;
}/* Recursive implementation 2 */
void CreateBinaryTree_2(BinaryTree *bt)
{char ch;scanf("%c", &ch);if (ch == '#') {*bt = NULL;} else {*bt = (BinaryTree)malloc(sizeof(struct Binary));(*bt)->data = ch;CreateBinaryTree_2(&((*bt)->lchild));CreateBinaryTree_2(&((*bt)->rchild));}
}void PreviousOrderTraverse(BinaryTree T)
{if (T == NULL) {return;}printf("%c", T->data);PreviousOrderTraverse(T->lchild);PreviousOrderTraverse(T->rchild);
}int main(void)
{BinaryTree bt;// bt = CreateBinaryTree_1();CreateBinaryTree_2(&bt);PreviousOrderTraverse(bt);return 0;
}

运行结果:

二叉树介绍与代码实现相关推荐

  1. java二叉树代码_JAVA语言实现二叉树生成的代码教程

    本文主要向大家介绍了JAVA语言实现二叉树生成的代码教程,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 给定某二叉树三序遍历中的两个,我们即可以通过生成该二叉树,并遍历的方法,求出剩 ...

  2. python简单代码画曲线图教程-Python绘制折线图和散点图的详细方法介绍(代码示例)...

    本篇文章给大家带来的内容是关于Python绘制折线图和散点图的详细方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.绘制折线图和散点图要用到matplotlib ...

  3. python画折线图代码-Python绘制折线图和散点图的详细方法介绍(代码示例)

    本篇文章给大家带来的内容是关于Python绘制折线图和散点图的详细方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.绘制折线图和散点图要用到matplotlib ...

  4. matlab opticalflowlk,Optical Flow介绍与代码实现

    Optical Flow介绍与代码实现 介绍 首先我们先来介绍一下Optical Flow是个什么东西, 在浏览器的搜索框框里面我们输入"Optical flow"可以看到维基百科 ...

  5. 深度学习推荐系统之wide deep介绍和代码实现

    阅读前思考 在你的应用场景中,哪些特征适合放在Wide侧,哪些特征适合放在Deep侧,为什么呢? 为什么Wide部分要用L1 FTRL训练? 为什么Deep部分不特别考虑稀疏性的问题? 系列导读 深度 ...

  6. 【2022年华为杯数学建模E题赛后总结加思路详细介绍配代码----10月11号写的总结】

    提示:下文将介绍2022年华为杯数学建模E题赛后总结加思路详细介绍配代码 傻逼队友,傻逼队友,傻逼队友一定要看好人在进行组队,这是劝告. 这里有几点总结进行描述: 第一,图一定要尽量多,对图的解释要多 ...

  7. C# 之 扑克游戏 -- 21点规则介绍和代码实现

    C# 之 扑克游戏 -- 21点规则介绍和代码实现 一,游戏介绍 1.1 游戏规则 1.2 牌点计算 1.3 判断胜负 二,游戏设计 2.1 游戏流程 2.2 玩家类 2.3 AI类 三,参考代码 一 ...

  8. 二叉树介绍 ~ 概念、存储结构、性质

    二叉树介绍 ~ 概念.存储结构.性质 1.二叉树的概念 2.特殊二叉树 3.二叉树的存储结构 4.二叉树的性质 5.相关案例 1.二叉树的概念 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由 ...

  9. 【线索二叉树】C++代码及线索化过程详解

    文章目录 线索二叉树的概念 中序线索二叉树的构造 中序线索二叉树的遍历 过程详解版代码 纯享版代码 我在这里不仅写了线索二叉树的普通代码,在代码中我还加入了线索化过程的打印,更好的帮助理解! 线索二叉 ...

最新文章

  1. CS131专题-6:图像特征(Blob检测、LoG算子、Harris-Laplacian)
  2. squid在企业网中的应用
  3. android 隐藏webview地址栏,flutter - 在Flutter Webview中隐藏Url引用 - SO中文参考 - www.soinside.com...
  4. cadence软件_IC苦逼搬运工入职之——Cadence基本操作(1)
  5. java switch小程序,小程序自定义switch组件
  6. # CF1572B Xor of 3(构造)
  7. 默认方法:Java 8的无名英雄
  8. Linux中Oracle的sqlplus下退格和Del键无效的问题解决
  9. #Tomcat# 本地正常但是部署到服务器后,mysql插入中文乱码问题解决!
  10. (112)FPGA面试题-简述FPGA设计覆盖率问题
  11. python中使用连续关系运算符_解释一下Python中的关系运算符
  12. 交叉验证与训练集、验证集、测试集
  13. 开源界也要封闭,OpenSource能否继续无国界 | 凌云时刻
  14. 解决XeLaTex编译后中文出现乱码的问题
  15. Visual Stdio 无法找到资源编译器DLL
  16. 另一种blast2go的思路
  17. linux运行魔力宝贝,魔力宝贝私服架设详细简易教程
  18. 经济学原理笔记-微观CP12-税制的设计
  19. Web基础(从零开始)——HTML文本域(textarea标签)
  20. LeCo-83.删除排序链表中的重复元素

热门文章

  1. redis rdb aof区别_Redis 持久化之 RDB 与 AOF 详解
  2. php wdatepicker,WdatePicker时间控件的使用
  3. python中的封装调用_Python基础之封装
  4. LeetCode 1712. 将数组分成三个子数组的方案数(前缀和 + 二分查找)
  5. LeetCode 988. 从叶结点开始的最小字符串(DFS)
  6. LeetCode MySQL 1435. 制作会话柱状图
  7. LeetCode 345. 反转字符串中的元音字母
  8. LeetCode 1348. 推文计数(哈希map+set)
  9. LeetCode 946. 验证栈序列(栈)
  10. LeetCode 937. 重新排列日志文件(自定义排序)