数据结构 | 【树与二叉树】考研相关结论与习题

相关结论

二叉树遍历

1、在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序完全相同。

2、 L、D、R分别表示遍历左子树、访问根结点和遍历右子树,     
      则先(根)序遍历二叉树的顺序是DLR,      
      中(根)序遍历二叉树的顺序是LDR,     
      后(根)序遍历二叉树的顺序是LRD,     
      还有层次遍历二叉树。

      这些方法的时间复杂度都是O(n),n为结点个数。

3、设n,m为一棵二叉树上的两个结点,中序遍历时,n在m前的条件是n在m左方。

      设n,m为一棵二叉树上的两个结点,后序遍历时,n在m前的充分条件是n是m子孙。

4、前序序列和中序序列相同的二叉树为空树或任一结点均无左孩子的非空二叉树;    
      中序序列和后序序列相同的二叉树为空树或任一结点均无右孩子的非空二叉树;     
      前序序列和后序序列相同的二叉树为空树或仅有一个结点的二叉树。

递归算法使用与树的高度成比例的栈空间。如果我们在每个结点中存储指向父结点的指针,那样可以使用迭代算法,只使用常数级空间实现所有这些遍历。然而,指向父结点的指针占用更多的空间。这只在需要指向父节点的指针或栈空间有限时才使用。

深度优先遍历在深度优先顺序中,我们希望从根结点访问最远的结点。和图的深度优先搜索不同的是,不需记住访问过的每一个结点,因为树中不会有环。前序,中序和后序遍历都是深度优先遍历的特例。
广度优先遍历和深度优先遍历不同,广度优先遍历会先访问离根节点最近的节点。 二叉树的广度优先遍历又称按层次遍历。算法借助队列实现。

有序树转化为二叉树

如果T2是由有序树T转换而来的二叉树,那么T中结点的前序就是T2中结点的前序,T中结点的后序就是T2中结点的中序。

线索二叉树

1、二叉树是一种逻辑结构。线索二叉树是一种物理结构。

2、线索二叉树明确指明了在存储过程中的数据存放方式,就是物理结构了。(物理结构=存储结构)

      注意:既指明了存储结构,又指明了逻辑结构的情况就是单独的“物理结构”。

3、n个结点的线索二叉树含有的线索数为n+1。

4、一颗任意的二叉树,也任意使用先序/中序/后序线索化,则线索化后其空链域最多有2个。

5、两个结点,在前序和后序中的前后关系不同,证明二者是父子关系;如果相同,二者是兄弟关系 。

6、后序线索二叉树中不能求后序后继 ,先序线索二叉树中不能求先序前驱。

树与森林

1、设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有n+1个。每一个非终端结点,一定会有且仅有一个孩子结点没有右邻兄弟,即右指针领域为空。

2、树与二叉树的转换:没有右侧指针的结点数 = 根节点 + 非叶节点数量

树转换为二叉树时,树中每一个分支结点的 所有子结点中最右子结点 无右孩子, 根结点转换后也 没有右孩子。因此,对应二叉树中无右孩子的结点个数=分支结点个数( 非终端结点)+1

哈夫曼树与并查集

1、在有n个叶子结点的哈夫曼树(度为2)中,非叶子结点的个数为n-1。


 相关例题

1、二叉树相关计算

1、一棵完全二叉树上有1001个结点,其中叶结点的个数是()

A.250    B.500    C.254    D.501

解:法1:    结点总数为1001,奇数,故n1=0。由n=n0+n1+n2;n2=n0-1得:n=n0+n1+n0-1,即1001=2*n0-1,得 n0=1002/2=501.

法2: 完全二叉树的最后一个结点编号为1001,由于其为奇数,因此其双亲结点编号为(1001-1)/2=500(若为偶数则直接除以2),双亲之后的结点都是叶结点,因此总叶结点n0=最后一个编号-其双亲编号=1001-500=501.

法3: 此完全二叉树深度为:log2(n)向下取整+1=10.其前9层满数,第9层结点数为2^(9-1)=256,则前9层的总结点数为:(2^9)-1=511,因此第10层的叶结点数为:1001-511=490,则第9层非叶结点个数为490/2=245(2对1),则第9层结点个数为:256-245=11。因此总叶结点为:第9层的+第10层的=11+490=501

答案:D

总结一下完全二叉树的最后一个结点的编号是n,则它的父结点的编号为[n/2],则叶子结点个数为n-[n/2]。


2、一棵有n个结点采用链式存储的二叉树中,共有( )个指针域为空。

A.n+1    B.n    C.n-1    D.n-2

解:每个节点有两个指针(左右指针),所以其有2n个指针用于指向孩子节点

除根节点外,每出现一个节点会占用其父节点的一个指针域,所以占据n-1个指针域

所以剩下的空指针域为2n-(n-1)=n+1

答案:A


3、已知一棵有2011 个结点的树,其叶结点个数为 116,该树对应的二叉树中无右孩子的结点的个数是( )。

A.115 B.116 C.1895 D.1896

解:法一:

树——>二叉树,大孩子变左孩子,兄弟变右孩子
因此对应的二叉树没有右孩子,说明该节点在树里右边没有兄弟,也就是说,该节点是其父节点最右边的孩子。有多少个有孩子的节点,就有多少个“最右的孩子节点”,因此2011-116=1895
此外,对于根节点而言,它没有父节点当然也没有兄弟,因此也是没有右孩子的。所以+1=1896

解释一波"有多少个有孩子的节点,就有多少个“最右的孩子节点"这句话,因为树没有左右之分所以有孩子可以说一定有右孩子节点

 

法二:

答案:D


4、已知一棵完全二叉树的第 6 层(设根为第 1 层)有 8 个叶结点,则完全二叉树的结点个数最多是 (          )。

解:如果第六层是满的话,那么第6层将会有32个节点,题目说只有8个叶节点,那只有两种情况:

1.6层只有8个节点,都是叶节点

2.6层节点满了,但有8个节点没有子节点,只能作为叶节点。

由于题目求更多:所以考虑第2钟情况:

这时候 前6层节点数为32+16+...+1 =63

第7层节点数:(32-8)*2=48 ——第6层节点数共32个,减去8个叶节点数,每个再带有两个子节点,相加——111

答案:111

注:

完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

(1)所有的叶结点都出现在第k层或k-l层(层次最大的两层)

(2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。

一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树。


 5、对于任意一棵高度为 5 且有 10 个结点的二叉树,若采用顺序存储结构保存,每个结点占 1 个存储单元(仅存放结点的数据信息),则存放该二叉树需要的存储单元的数量至少是:

A、31    B、16    C、15    D、10

解析:因为是顺序存储结构保存,所以需要的存储单元是给定高度的全部结点都要考虑。
高度为5的满二叉树共有:
25-1=31个结点
31*1个存储单元=31;


6、一个深度为h的满k叉树有如下性质:第h层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序(同层自左至右)从1开始对全部结点编号,问:
(1)各层的结点数目是多少?
(2)编号为i的结点的双亲结点(若存在)的编号是多少?
(3)编号为i的结点的第j个孩子结点(若存在)的编号是多少?
(4)编号为i的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少?

解:

(3)编号为i的结点的第j个孩子结点(若存在)的编号是多少?

假设i的位置如上,j 是 i 的第一个子节点。
i 的前面有(i-1)个节点,每一个节点有k 个子节点,
所以j 前面有((i-1)*k)+1 个节点,为什么要加1呢,
因为(i-1)*k 没有包括根节点,
所以j 前面的节点再加一,((i-1)*k)+2 就是j 节点的编号。

( ( i − 1 ) ∗ k ) + 2 ((i-1)*k)+2 ((i−1)∗k)+2

衍生问题,如果问的是i的第k个孩子的编号怎么办?

第一个孩子 ( i − 1 ) ∗ k ) + 2 (i-1)*k)+2 (i−1)∗k)+2
那么第k个孩子 ( i − 1 ) ∗ k ) + 2 + k − 1 (i-1)*k)+2 + k -1 (i−1)∗k)+2+k−1

(2)编号为i的结点的双亲结点(若存在)的编号是多少?

这次就是求i 的父节点j 的编号,我只会使用数学的推算方法,联想不出来这个题。
因为i是j子节点,所以可以用j 来求i 的编号,
i = ( ( j − 1 ) ∗ k ) + 2 i=((j-1)*k)+2 i=((j−1)∗k)+2
i − 2 = ( j − 1 ) ∗ k i-2=(j-1)*k i−2=(j−1)∗k
( i − 2 ) / k = j − 1 (i-2)/k=j-1 (i−2)/k=j−1
j = ( ( i − 2 ) / k ) + 1 j=((i-2)/k)+1 j=((i−2)/k)+1

第三题就是通过第二题得到的结果,逆向推理得到的结果。

图中红色的就是没有右兄弟,除了红色的节点,其他的节点都有右兄弟
通过图片可以发现,只要i 不是每个节点的最右节点,
换个说法,只要i 不是双亲的第k个孩子就有右兄弟
对于任意的节点p ,其k 个子节点的编号是p*k+1
则有:
i ! = p ∗ k + 1 i!= p*k+1 i!=p∗k+1
i − 1 ! = p ∗ k i-1 != p*k i−1!=p∗k
最后结果可以写成:
( i − 1 ) % k ! = 0 (i-1)\% k !=0 (i−1)%k!=0
其实就是保证当前节点减一不是k的倍数,就可以保证该节点是有右兄弟的。
 


2、二叉树遍历与线索二叉树

7、______线索树的遍历仍然需要栈的支持。

解:

如果是普通的二叉树,不管是递归算法(隐含递归栈),还是非递归算法(使用栈)都是需要栈的支持的。

那么,现在不需要了,原因:使用了线索二叉树。

遍历关键 —— 找到你的下一个是谁。

叶子结点全部有线索了,所以只需要考虑非叶子结点能都找到后继。

如上图所示,后序线索树遍历时,最后访问根节点。如果是从右孩子x返回访问父节点
由于节点x的右孩子不一定为空,此时右指针无法指向其后继,因此通过指针可能无法遍历整棵树
如图中,节点中数字表示遍历顺序。
a、节点6的右指针指向其右孩子5,而不指向其后序后继节点7
b、因此后序遍历还需要栈的支持,而前序和中序可以不用。


8、在二叉树中有两个结点m和n,若m是n的祖先,则使用_____遍历可以找到从m到n的路径。

答案:后序遍历

不少人误认为“路径”是visit()输出的序列顺序,而路径”是遍历过程中栈中元素的顺序

后序遍历中m是第一个入栈最后一个出栈,当n入栈时在栈中就会有m→n的路径。

前中序在n入栈前它的祖父结点早就出栈了。前序是一定没有;中序是有可能有(主题这个图片就是没有的情况);后序是一定有。

首先需要理解的是,前中后序遍历都是通过递归的方式,将后来需要用到的结点保存在栈中

比如下面这颗树:

如果是前序遍历,根左右,过程是:

根节点m入栈并输出,访问m的左孩子a,a入栈并输出,访问a的左孩子c,c入栈并输出,c没有左孩子,无元素入栈,c没有右孩子,无元素入栈,c出栈,此时栈顶元素为a,访问a元素的右孩子d,d入栈并输出,d没有左孩子,无元素入栈,d没有右孩子,无元素入栈,d出栈,a左右子树都访问完了所以出栈,现在栈顶元素是m,m已经没有作用了所以出栈,访问m的右孩子b,m的右孩子b入栈并输出,接着访问b的左孩子e,e入栈并输出……

如果中序遍历,左根右,过程是:

根节点m入栈,访问m的左孩子,所以m的左孩子a入栈,访问a的左孩子,所以a的左孩子c入栈,c没有左孩子,c现在输出并出栈,c没有右孩子所以没有元素入栈,现在栈顶元素是a,a输出并出栈,a的右孩子d入栈,此时d没有左孩子所以没有元素入栈,d输出并出栈,d没有右孩子所以没有元素入栈,现在栈顶元素是m,m输出,此时m已经没有作用了所以出栈,m的右孩子b入栈,访问b的左孩子,所以b的左孩子e入栈……

所以在前序和中序的过程中,如果n在m的右子树部分,遍历过程中找到了n,但是m已经不在栈中,因为栈中只会保留等会需要用到的e和b结点,而m已经完成了访问根结点和m的左子树的任务,已经被出栈,所以无法追溯n如何走到m

但是后序遍历就不一样啦,后序的顺序是左右根,所以只要m的左右子树还没遍历完成,m就不能出栈,在遍历m的左右子树过程中,无论在m的左边还是右边找到了n,都可以直接返回然后根据栈中的路径让n找到回到m的路,这样就能找到m到n的路径~

所以一旦n在m的右子树,且离的较远,m就会在前序和中序的过程中因为已经完成了访问左、访问根的任务,而被栈遗忘,让找到了n的时候也不知怎么回到m……而只有后序会让作为祖先(子树的根)的m永远被铭记直到n找到m为止…


动图:在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径 - 鱼大鹿 - 博客园


9、 若X是二叉中序线索树中一个有左孩子的结点,且x不为根,则x的前驱为( )

A.X的双亲        B.X的右子树中最左的结点

C.X的左子树中最右结点        D.X的左子树中最右叶结点

【解析】

中序遍历:LNR,有左孩子则其前驱应为其左子树的最后一个结点。

问题转变:寻找一个子树的最后一个结点。

怎么找?——循环访问右孩子直到没有右孩子的那个结点,就是最后一个结点。

综上,首先确定是左子树,然后确定是该左子树的最右结点。

注意:不是最右叶结点,思考情况最右结点入果有左孩子? 也可以。

【答案】C


10、若一棵二叉树的前序遍历序列和后序遍历序列分别为1,2,3,4和4,3,2,1,则该二叉树的中序遍历序列不会是()

A.1,2,3,4     B.2,3,4,1     C. 3,2,4,1     D. 4,3,2,1

【解析】

法一:最简单的做法就是选项的中序+题干前序得到树然后判断后序是否正确。

法二:

前序:根左右:根左,根右,左右;

后序:左右根:左根,右根,左右;

两个结点,在前序和后序中的前后关系不同,证明二者是父子关系;如果相同,二者是兄弟关系。

1,2,3,4与4,3,2,1两两关系都不相同,所以肯定是4个父子关系。所以1一定是根节点。那么1要么在最左,要么在最右。ABCCD均符合。

然后再看 2,3,4,和4,3,2那么2为根节点,那么2要么在最左,要么在最右。C错误。


11、先序序列为a,b,c,d 的不同二叉树的个数是 () 。

【解析】

前序序列和中序序列的关系相当于以前序序列为入栈次序,以中序序列为出栈次序。

转化为“以序列a, b, c, d为入栈次序,则出栈序列的个数为多少”。

对于n个不同元素进栈,出栈序列的个数为

卡特兰数的应用

  • 出栈次序
  • n个节点的二叉树构成
  • 凸多边形的三角形划分
  • 括号匹配,网格两点之间抵达方案等

3、树与森林

12、设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有____个。

【解析】

法一:

①    森林的非终端结点一定是二叉树的非终端结点,森林的叶子结点一定是二叉树的空左指针结点(值得注意的是,森林的叶子到二叉树里,可能是叶子也可能不是,这取决于有没有兄弟)

②    设森林F的终端结点数为f,总结点数 f + n。二叉树B每个结点有两个指针,总指针数 2(f + n)

③    二叉树B除去根结点,都是某个结点的孩子, 也就是总有:某个结点必有指针指向他,因此占用指针数为 f + n – 1,减1是因为根结点不用指针指向

④    剩余空指针数为 2(f + n)- (f + n - 1)= f + n + 1 个

⑤    f 个终端结点没有孩子,因此转换为二叉树B后,这些结点的左指针必为空,所以空的左指针域为f 个,除此之外都不可能是空左指针的结点

综上,二叉树B 中右指针域为空的结点有 ( f + n + 1 ) - f = n + 1

法二:

根据森林转换为二叉树的"左孩子右兄弟"的表示法,即对于每棵二叉树,每个结点的右指针指向其右邻兄弟。

针对每一个非终端结点,一定会有且仅有一个孩子结点没有右邻兄弟,即右指针领域为空。因此N个非终端结点,就有N个右指域为空。

看院单棵二叉树,再来看这些二叉树是怎么连接成一棵二叉树的。

原理是:将后一棵二叉树的根节点作为前一棵二叉树的右孩子连接起来,所以只有最后一棵二叉树的根结点没有右孩子,即右指域为空。

因此综上:N个非终端结点,就有(N+1)个结点的右指针域为空。


13、已知一棵有2011个结点的树,其叶结点个数为116,该树对应的二叉树中无右孩子的结点个数是()

A. 115     B. 116      C. 1895      D. 1896

【解析】

法一:

直接找有几对亲兄弟即可。

如果一个结点不是叶节点。那么就会有孩子,这些孩子就是一组亲兄弟。

没有右侧指针的结点数=根节点+非叶节点数量

5-1. 已知一棵有 2011个结点的树,其叶结点个数为116,该树对应的二叉树中无右孩子的结点个数是 ( )。【2011年全国试题6(2分)】 A.115 B_哔哩哔哩_bilibili

法二:


4、哈夫曼树与并查集

14、若度为m的哈夫曼树中,叶子结点个数为n,则非叶子结点的个数为()

【解析】

法一:

度为m的哈夫曼树意味着在这棵树中仅有度为0的结点和度为m的结点。

一开始,n个数据(需要处理的叶子结点),进行一次处理是m合1

那么一次处理对应:需要处理的数据减少 m-1,非叶子结点+1.

一共需要处理n-1个数据,一次处理m-1个,处理一次非叶子结点个数+1.

问:有多少非叶子结点? C向上取整。

法二:

因为度为m的哈夫曼树中,节点的度只有0或m。假设非叶节点(即度为m的节点)个数为a,由题意知叶结点个数(即度为0节点个数)是n。在该哈夫曼树中度为m的节点有m个分支,度为0的节点有0个分支。

因为  树的总结点数=总分支数+1,所以有  n+a=a*m+n*0 +1 ,化简后有a=(n-1)/(m-1)


15、下列选项给出的从根分别到两个叶子结点路径上的权值序列,能属于同一棵哈夫曼树的是:

A. 24,10,5 和24,10,7
B. 24,10,5和24,12,7
C. 24,10,10和24,14,11
D. 24,10,5和24,14,6

 哈弗曼树的路径问题_DrCrypto的博客-CSDN博客


数据结构—树与二叉树篇II_fir_dameng的博客-CSDN博客

在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径_柳婼的博客-CSDN博客_在二叉树中有两个结点m和n,如果m是n的祖先

数据结构-满k叉树例题_ChinaSugarMan的博客-CSDN博客_一个深度为h的满k叉树
有关树的几个经典问题_蓝旭晨枫╮-CSDN博客_后序线索树的遍历仍需要栈的支持

设F是森林,B是由F转换得到的二叉树,F中有n个非终端结点,B中右指针域为空的结点有_______n+1_______ - 有蚊子 - 博客园

  • 18
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西皮呦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值