有关森林、树转换成对应二叉树的问题
最近刷题发现有类似于将树或者森林转换成二叉树之后右指针为空的题目,解题思路比较绕,然而最近发现了新的想法,就在这里记录一下,避免以后忘记
一、树转换成对应二叉树,无右孩子节点个数的问题
它告诉你这棵树有2011个节点,其中叶节点个数为116,求这棵树对应二叉树中无右孩子节点的个数是多少。
首先要明确,树转换成二叉树,一个结点的的最左子节点成为其左孩子,其最相邻的右兄弟成为其右孩子
所以这道题第一个思路首先是寻找其没有右兄弟的结点的个数 首先我发现对于一个度为n(n>0)的非叶父节点,他有n-1个子节点都是有右兄弟的, 而我知道这颗树有2011 - 116个非叶节点, 且这棵树的度为 2011-1 那么我们就知道,有右兄弟的节点有 (2011 - 1) - (2011 - 116) = 115个 那么没右兄弟的节点就是 2011 - 115 = 1896个
那这样很绕对吧,非常绕,搞得人头昏,有没有简单一点的思路
我们知道重新审视一下上面的题目,好像有点过分利用了节点的度这个条件,我们应该可以绕开度来解决这个问题
下面是重点 我们知道对于每个非叶节点,他会产生n-1个有右兄弟的节点(我们这时候不考虑节点本身), 那么每个非叶子节点就会产生一个无右兄弟的节点 这个时候我们递归来看,首先第一个根节点肯定是没有右兄弟的,另外其如果产生子节点, 那么这些子节点中, 只有一个子节点没有右兄弟, 而这些子节点如果又有子节点,其子节点中也只有一个没有右兄弟
如下图所示
因此没有右兄弟的节点数就是其 非叶节点数+1(根节点) 带到上一题中,就是2011 - 116 + 1 = 1896个
二、森林转换成二叉树,对于无右孩子节点的问题
题例 森林F中有n个非终端节点,则转换后的二叉树右孩子为空的节点数有多少个
首先我们确定,森林中每棵树独立转换成二叉树, 其产生了 非叶子节点+1(根节点)个无右孩子的节点 另外,将由树转换成的二叉树拼接,由于转换成的二叉树的根节点是没有右子树的(之前已经说过一次了),因此只需要将下一个要合并的树的根拼到前一个合并的树的右子树上即可, 因此, k颗树拼接,消耗掉了 k-1 个空的右子树 然后我们将其相加 , 合并后二叉树B 的右子树为空的节点个数为: n + k - (k-1) = n+1 题目得解
三、总结
总结就不必要了,主要是意识到每个非叶节点的子节点中,有且只有一个节点无右兄弟,而这个节点在转换成二叉树时,就是那个没右子树的节点
|