具有n个结点的完全二叉树的深度_树与二叉树递归版c++

73f291a95c1cc2d118a3f00e3f983c62.gif
69e711d46c4b44201ac276aca10e81b2.png
bd6210ae1617b0839b3445f9951c288a.png

树(Tree)

1.什么是树?

树是n个结点的有限集合。

bfc353e9cd973338bb0bbc5ca59fe0eb.png

当n=0时,称为空树。而任意非空树应满足:

a.有且仅有一个特定的根结点。如“E”是该树的根结点。

b.当n>1时,其余结点可分为m(m>0)个互不相交的有限集合。其中每一个集合本身又是一棵树,称为根结点的子树。如“A”是一棵子树。

*注:n个结点的树有n-1条边。

2.树的其他概念

1.结点:指包含数据元素及若干个指向其子树的分支。2.根节点:没有父节点的结点。3.父结点:指向子结点的结点。如"E"是"A"和"F"的父结点。4.子结点:被父结点指向的结点。5.兄弟结点:具有相同父结点的多个结点称为兄弟结点关系。6.叶子结点(终端结点):没有子节点的结点。7.度:结点拥有子树数称为结点的度。如“A”的度是3。8.高度:结点到叶子结点的最长路径所包含的边数。9.深度:根结点到结点的路径所包含的边数。10.层数:树的层次从根结点开始为第一层。
2650eb7c50f453f57805a6066e55923a.png

二叉树(binary Tree)

1.什么是二叉树?

二叉树(binary tree)T是有限个元素的集合(可以为空)。当二叉树非空时,其中有一个元素称为根,余下的元素(如果有的话)被划分成两棵二叉树,分别称为t的左子树和右子树。

851afe93a610ce3a6a88df518b27786f.png

a.二叉树的每个元素都恰好有两棵子树(其中一个或两个可能为空)。

b.二叉树中的每个元素的子树都是有序的,也就是说,有左子树和右子树之分。

2.二叉树的五种形态:

二叉树一共有五种基本形态。

(1)空二叉树。(2)只有一个根结点。(3)根结点只有左子树。(4)根结点只有右子树。(5)根结点既有有左子树又有右子树。

3.特殊二叉树

a.斜树:所有的结点都只有左子树的二叉树叫左斜树,反之就是右斜树。b.满二叉树:除最后一层无任何子结点外,每一层上的所有结点都有两个子结点的二叉树。c.完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
39981ab1f4ea17e34155aabdd5a81d65.png

*注:满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。

4.二叉树的性质

性质1:一棵二叉树的第i层上至多有2^(i-1)(i>=1)个结点。性质2:一棵二叉树的高度为k(k≥1),它最少有k个元素,最多有2^k-1个结点。性质3:一棵二叉树如果其终端结点数为n0,度为2的结点数为n2。则n0=n2+1。性质4:一棵二叉树有n个元素,n>0,它的高度最大为n,最小高度为[log2n]+1。性质5:设完全二叉树的元素其编号为i, 1≤i≤n,有以下关系成立: (1)若i=1,则该元素为二叉树的根。若i>1,则其父节点的编号为[i/2]。 (2)若2i>n,则该元素无左孩子。否则,其左孩子的编号为2i。 (3)若2i+1>n,则该元素无右孩子。否则,其右孩子的编号为2i+1。

5.二叉树的存储

A.顺序存储

用数组来存储,对于二叉树,如果节点X存储在数组中的下标为i,那么它的左子节点的存储下标为2*i,右子节点的下标为2*i+1,反过来,下标i/2位置存储的就是该节点的父节点。

缺点:如果不是按完全二叉树的性质存储就容易浪费存储空间。

B.链式存储

每个节点由3个字段,其中一个存储数据,另外两个是指向左右子结点的指针。我们只要拎住根节点,就可以通过左右子节点的指针,把整棵树都串起来。这种存储方式比较常用,大部分二叉树代码都是通过这种方式实现的。

d6f275bcbb8e8768346ab4fcfb76dcea.png

二叉树的遍历(递归)

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

深度优先搜索①前序遍历:先遍历这个节点,然后再遍历它的左子树,最后遍历它的右子树。②中序遍历:先遍历它的左子树,然后再遍历它的本身,最后遍历它的右子树。③后序遍历:先遍历它的左子树,然后再遍历它的右子树,最后遍历它本身。
7b194d4ed674ef33c336d86585ebcd75.png

1.三种遍历的代码:

97278b7ddae06bbc3920bf8af1db587f.png

力扣第94、144、145题

2.二叉树的链式存储

a5dff88c96163def6a4f0d0aee48bc39.png

3.构造树的结构图

1e51234ceba3971d1d6b3c62654cd983.png

以上的代码只实现了TreeNode.h和Traversal_recursion.h的头文件。

在后面会以力扣为模型,实现迭代版二叉树及全部方法文件。

代码:

https://gitee.com/yaoshanxia/data-structure-and-algorithm/tree/master/Tree

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值