首页 > 其他分享 >二叉树的复习

二叉树的复习

时间:2023-01-18 17:58:10浏览次数:45  
标签:左子 结点 遍历 复习 右子 访问 二叉树

特殊的树状结构--二叉树

二叉树是n(n>=0)个结点的集合,该集合或者为空集(称为空二叉树),或者由一个结点和两棵互不相交的,分别称为根结点的左子树和右子树的二叉树组成。

二叉树的特点:
1,每个结点最多两棵子树,所以二叉树中不存在度大于2的结点

2,左子树和右子树是有顺序的,次序不能任意颠倒。

3,即便树中某结点只有一棵子树,也要区分他是左子树还是右子树。

 

二叉树的基本形态:

1,空二叉树。

2,只有一个根节点。

3,根节点只有左子树。

4,根节点只有右子树。

5,根节点既有左子树,又有右子树。

 

特殊二叉树:

1,斜树,只有左子树被称为左斜,只有右子树被称为右斜

2,满树,在一个二叉树中,如果所有分支结点都存在左右子树,并且所有叶子都在同一层上,这样的二叉树被称为满树。

3,完全二叉树,对一棵具有n个结点的二叉树按层序编号,如果编号为i(i<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二

叉树位置完全相同,则这棵二叉树称为完全二叉树。

满树一定是完全二叉树,但完全二叉树不一定为满树。

 

完全二叉树的特点:

1,叶子结点只能出现在最下两层。

2,最下层的叶子一定集中在左连续位置。(因为排序是按左先满)

3,倒数第二层,若有叶子结点,一定都在右部连续位置。

4,如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况。

5,同样结点树的二叉树,完全二叉树的深度最小。

 

二叉树的性质

1,第i层至多2^(i-1)个结点。

2,深度为k的二叉树至多有2^k-1个结点。

3,对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1.(n0+n1+n2-1=n1+2n2)

4,具有n个结点的完全二叉树的深度为[logn]+1;注意对于深度为k的二叉树,结点n范围一定为:2^(k-1)-1<n<2^k-1,否则不是完全二叉树。

5,如果对一棵有n个结点的完全二叉树的结点按层序编号1,对于任一结点i有:

  ①,如果i=1,则i结点是二叉树的根,无双亲;如果i>1,则其双亲是结点i/2.

  ②,如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i.

  ③,如果2i>n,则结点i无右孩子;否者其右孩子是结点2i+1.

 

二叉树的存储结构

一,顺序存储

虽然树用顺序存储比较困难,但二叉树是特殊的树,顺序储存也能实现。

用数组的下标体现其逻辑关系。若不是完全二叉树,就会出现浪费空间的现象,所以顺序存储一般只用于完全二叉树。

二,二叉链表

二叉树每个结点最多有俩个孩子,所以为它设计一个数据域和两个指针域,这样的链表,就叫做二叉链表。

typedef struct BiTNode   //结点结构
{
    TElemType data;          //结点数据
    struct BiTNode *lchild,*rchild;      //左右孩子指针    
}BiTNode,*BiTree; 

如果需要还可以增加一个指向其双亲的指针域,就变成了三叉链表

 

关于二叉树的遍历

二叉树的遍历是指从根节点出发,按照某种次序(类似一种递归操作)依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。

关键在于:访问和次序

访问,是指具体要对结点所作的操作

次序,如前,中,后三种

 

遍历方法

1,前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。

1 void PreOrderTraverse(BiTree T)
2 {
3     if(T==NULL)
4             return;
5     printf("%c",T->data);//这个的访问操作,为打印。
6     PreOrderTraverse(T->lchild);//进行递归操作
7     PreOrderTraverse(T->rchild);//进行递归操作
8 }

 

2,中序遍历:规则是若树为空,则空操作返回,否者从根节点开始(注意不是先访问根结点),中序遍历根结点的左子树,然后是访问根节点,最后中序遍历右子树

1 void InOrderTraverse(BiTree T)
2 {
3     if(T==NULL)
4             return;
5     InOrderTraverse(T->lchild);//递归,遍历左子树
6     printf("%c",T->data);//显示结点数据,相当于对此结点的访问
7     InOrderTraverse(T->rchild);//递归,遍历右子树
8 }

 

3,后序遍历:规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。

void PostOrderTraverse(BiTree T)
{
    if(T==NULL)
            return;
    PostOrderTraverse(T->lchild);//后序遍历左子树
    PostOrderTraverse(T->rchild);//后序遍历右子树
    printf("%c",T->data);//访问结点内容
}

 

注意前中后,是指根结点的访问次序。

4,层序遍历:规则是若树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问,从上而下遍历,在同一层中,按从左到右的顺序对结点逐个访问。

 

由遍历结构推导其次序的步骤:

1,前序或后序确定根节点,//已知前序和后序,是没办法确定一颗二叉树的,因为不知道左子树和右子树。

2,中序根据根节点,确定根节点的左子树和右子树。

3,进行递归操作。

 

标签:左子,结点,遍历,复习,右子,访问,二叉树
From: https://www.cnblogs.com/abwork-space/p/17060317.html

相关文章

  • python复习功课
    一、类方法(实例方法、类方法、静态方法)使用方式:1.实例方法是必须实例化可访问构建方法中的实例属性,也可通过类名去使用类属性,常用是实例化类给到一个类对象,用类对象.方法......
  • 【DFS】LeetCode 543. 二叉树的直径
    题目链接543.二叉树的直径思路创建全局变量diameter以记录左子树高度加右子树高度,并在DFS过程中维护此变量。代码classSolution{intdiameter;publ......
  • Java 基础复习
    Java基础复习java常用转义字符1)\t一个制表位,实现对齐的功能2)\n换行符3)\\一个\4)\"一个"5)\'一个'6)\r一个回车注释单行注释//多行注释/**/文......
  • 树结构的复习
    树:n个结点的有限集。n=0时称为空树。在任意一棵非空树中,仅有一个根结点;当n>1时,其余结点可分为m个互不相交的有限集,每个集合又是一个树结构,相当于D&C树:一对多的数据结构.......
  • BBS项目复习总结
    BBS之用户注册思路梳理:1.新建一个django项目,名称可以和bbs相关,准备好数据库、静态模板资源及配置好模板、数据库、用户表重命名配置。2.先准备bbs项目8张表,并理清表之前......
  • IoT Network Transport Layer 复习笔记 南安
    ServicesProvidedtoApplicationLayer:TCP/IPUDPTransportServicePrimitives传输服务原语Addressing寻址当一个应用进程希望与另一个远程应用进程建立连接......
  • Vue 快速复习
    基本语法模板语法1.{{msg}}2.v-html="attName"3.v-bind:xxx="attName"or:xxx="attName"==><tagxxx="val"/>4.在模板中使用js表达式,比如{{ok?"YES"......
  • 算法刷题 Day 17 | 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和
    今日内容:平衡二叉树二叉树的所有路径左叶子之和详细布置迭代法,大家可以直接过,二刷有精力的时候再去掌握迭代法。110.平衡二叉树(优先掌握递归)再一次......
  • 代码随想录18 LettCode 513. 找树左下角的值 112. 路径总和 106. 从中序与后序遍历序
    513.找树左下角的值下面运用层序遍历法比较简单,当遍历到一层时设立一个值去不断覆盖一层的队头,即最左边元素classSolution{public:intfindBottomLeftValue(Tr......
  • 二叉树的线索化——C语言描述
    二叉树的线索化——C语言描述目录二叉树的线索化——C语言描述0测试用例框架1定义2数据结构3实现方法4测试用例0测试用例框架https://blog.csdn.net/m0_59469991......