二叉树公式及详解。

本文深入解析二叉树的基本概念,包括度、节点分类,以及满二叉树、完全二叉树的定义与性质。重点讲解了完全二叉树的关键性质、遍历方法,并提供实例和代码示例。涵盖了深度计算、平衡二叉树与复杂性讨论,适合初学者和面试准备者查阅。
摘要由CSDN通过智能技术生成

基本名词概念

二叉树:n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为控时,称该二叉树为空二叉树。在二叉树中,一个元素也称为一个节点。(这段官话)

简单理解就是二叉树还是树,但是节点最多二个分叉。

树的度:一个节点有m个分叉,那么这个节点的度就为m。叶子节点的度为0,因为它没有分叉。

二叉树节点的度只有0,1,2这三种,其中为0的肯定是叶子节点。

二叉树的高度(深度):max(左子树深度,右子树深度)+1。

二叉树节点的分类:主要就三种,不谈那些孩子,兄弟,祖先,子孙啥的。

       根节点
  叶子节点 :度为0
  分支节点 :度不为0的节点。

二叉树的分类:

  1. 满二叉树:一棵深度为k且有个节点的二叉树称为满二叉树。

其实就是除了叶子节点,每个节点都有两个分叉(两个度,两个孩子)。如下图深度为4(根算1,按1来算,有些根不算深度,比较扯),节点总数2的4次方减1为15个。

 

 

  2. 完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。 

其实就是很标准的二叉树,就是有残缺,可以理解为满二叉树的阉割版。

完全二叉树有哪些性质呢?

  • 在二叉树上的第i层上之多有个节点(i>=1) :看上图就知道了,最多也就是满的意思呢嘛。
  • 深度为k的二叉树至多有个节点(k >= 1) : 这个也很好理解,和上面一条性质基本一样的意思,只不过上一个只是求一层的节点树,而本条性质是求所有节点。
  • 比较重要的一条性质:n0、n1、n2分别代表节点的度数为0、1、2。n为总结点数,则有:

              n0 = n2 + 1;    ① 这条可以 点这里,也可以 点这里

              n = n0 + n1 + n2;   ② 这条很好理解,个类度的节点加起来不就是总节点呢嘛。

             分支总线 = n - 1 = n1 + 2n2;   ③ 这条根据①②就能推出来。

  • 具有n个节点的完全二叉树的深度为 ,也就是深度公式其实就是以2为底N的对数下取整(下取整是指比如9.2点,上取整就是10,下取整就是9了),然后再+1就是深度了。
  • 如果对一棵有n个节点的完全二叉树的节点按层序编号,则对任意节点 i ( 1 <= i <=n ) 有:

             如果i=1, 则结点i是二叉树的根, 无双亲;如果i>1, 则其双亲parent (i) 是结点(i/2)下取整.

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

             如果2i+1>n, 则结点i无右孩子, 否则其右孩子rchild (i) 是结点2i+1.

             以上三个“如果”,可以对比下图验证:

 

  3. 平衡二叉树:又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

其实就是每个节点下挂着的的左右子树可以不一样长,但是不一样长的长度差不能超过1.

  4. 234树什么的,这里有篇博客写的很好,点这里。

  5. 红黑树什么的,这里提供一个在线画红黑树的网址,可以观察其变化,点这里

当然也可以去B站看234树向红黑树演变的相关视频,左旋右旋什么的代码部分混,确实有点头大。

 

二叉树相关面试题关键性公式:

n0、n1、n2分别代表节点的度数为0、1、2。n为总结点数

1.  只要是树,就都满足 节点个数n = 所有节点的度之和 + 1

2.  包括二叉树,节点和度关系满足  n = n0 + n1 + n2 = n1 + 2n2 + 1

3.  根据上一条,很容易得到 n0 = n2 + 1

4.  具有n个节点的完全二叉树的深度为 也就是深度公式其实就是以2为底N的对数下取整(下取整是指比如9.2点,上取整就是10,下取整就是9了),然后再+1就是深度了(上面已经写过)。

上面四个公式基本就够用了,上例题1:

例题2:

例题3:

  5. 还有一个公式比较关键按照二叉树的定义,n个节点的二叉树共有多少种?

                    这是一个卡兰特数,咱也不懂,瑟瑟发抖。或者直接套公式:

 

二叉树的遍历:

 前序:根结点第一个访问,然后访问左、右孩子;
后序:根结点最后访问,开始先访问左、右孩子;
中序:根结点第二个访问,最先访问左孩子,最后访问右孩子。

如这样一棵树:

前序序列结果:0134256
后序序列结果:3415620
中序序列结果:3140526

前序遍历java代码实现:

手打中。。。持续更新

中序遍历java代码实现:

手打中。。。持续更新

后序遍历java代码实现:

手打中。。。持续更新

内容并不完善,后期还会增加修改!

内容如果有错误的地方,欢迎各位朋友批评指针,万分感谢!🙂

  • 29
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
二叉树是一种常用的数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。创建二叉树的方法有多种,最常用的是递归和非递归方法。 递归创建二叉树的过程如下:首先定义一个二叉树节点的结构,包含节点值、左孩子和右孩子三个属性。然后利用递归函数,根据给定的数列或输入,依次创建节点并建立它们之间的关系。具体步骤如下:若输入为空,则返回空节点;否则,创建一个新节点作为当前节点,将当前节点的值设为输入的第一个值,将输入的余下部分分为左右两个部分,第一个部分为左子树的输入,第二个部分为右子树的输入。然后递归调用该函数,分别构建左右子树,并将返回的左右子树作为当前节点的左右孩子。 二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。前序遍历先访问根节点,然后遍历左子树,最后遍历右子树;中序遍历先遍历左子树,然后访问根节点,最后遍历右子树;后序遍历先遍历左子树,然后遍历右子树,最后访问根节点。对于每个节点,遍历方法是一样的,先访问当前节点后,再递归地遍历左右子树。 在编程竞赛平台pta上,可以使用C++或其他编程语言来实现二叉树的创建和遍历。注意在创建二叉树时,需要读入并解析输入,构建二叉树并返回根节点。而在遍历二叉树时,可以定义一个递归函数,在访问每个节点时,先输出节点值,然后递归地遍历左右子树。可以根据具体问题的要求,选择不同的遍历方式来实现对二叉树节点的访问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值