首页 新闻 会员 周边 捐助

递归判断完全二叉树

0
[已解决问题] 解决于 2015-12-01 18:40

完全二叉树的定义是只有最后一行可以不是满的,这一行的所有节点均是从左往右放置的。

现在大部分算法都是BFS的层次遍历,有没有递归的方法的呢?

现在找到的比较接近的递归算法是这样的

 1 bool isFullTree(tree *T)
 2 {
 3     if(T!==NULL){
 4         if(T->rchild!=NULL&&T->lchild==NULL)
 5             return false;
 6         isFullTree(T->lchild);
 7         isFullTree(T->rchild);
 8     } 
 9     return true;
10 }      

但是这里的有一个反例,如果是一个深度为3的二叉树,最后一行的2个节点全部在右侧,左侧那棵树在最后一行没有节点的时候,这个算法依旧会判断为完全二叉树。

求解如何修正。

sean10的主页 sean10 | 菜鸟二级 | 园豆:206
提问于:2015-11-29 18:19
< >
分享
最佳答案
0

哪有什么2个节点全在右侧?

奖励园豆:5
吴瑞祥 | 高人七级 |园豆:29449 | 2015-11-30 09:53

深度为3的二叉树,第三行不是可以有四个叶子节点吗,然后这行只有右边子树有2个叶子节点,左边没有,用这个算法也会判断成完全二叉树。

sean10 | 园豆:206 (菜鸟二级) | 2015-11-30 12:36

@sean10: 

1 1-1  1-2  1-1-1  1-1-2  1-2-1 1-2-2  你说情况是,1-1有子节点1-2有值但没有子节点?

上面的递归算法没有最后一层的逻辑。他判断的只是左右情况,而算法要求是实现最后一层的左右情况

如果不是最后一层,需要验证左右都有值,你要改的话就加一个判断下层的逻辑,

吴瑞祥 | 园豆:29449 (高人七级) | 2015-11-30 13:48

@吴瑞祥: 不是,不过我想了一下,确实递归不能实现,完全二叉树的结构就不是分形的,需要判断层次,那就不是纯递归了。谢谢~

sean10 | 园豆:206 (菜鸟二级) | 2015-12-01 18:40
其他回答(1)
0

其实是可以递归判断的,分情况讨论:

  • 判断完全二叉树的条件:
    • 左右子树都是满二叉树,且高度相同(满二叉树);
    • 左右子树都是满二叉树,且左子树的高度+1;
    • 左子树是满二叉树,右子树是完全二叉树,且高度相同;
    • 左子树是完全二叉树,右子树是满二叉树,且左子树的高度+1;
class Solution:
    def isCompleteTree(self, root: TreeNode) -> bool:

        from dataclasses import dataclass

        @dataclass
        class Info:
            height: int
            is_full: bool
            is_cbt: bool
        
        def dfs(x):
            if not x: return Info(0, True, True)

            l, r = dfs(x.left), dfs(x.right)
            height = max(l.height, r.height) + 1
            is_full = l.is_full and r.is_full and l.height == r.height
            is_cbt = is_full \
                or l.is_full and r.is_full and l.height - 1 == r.height \
                or l.is_full and r.is_cbt and l.height == r.height \
                or l.is_cbt and r.is_full and l.height - 1 == r.height
            
            return Info(height, is_full, is_cbt)
        
        return dfs(root).is_cbt

还有另一种根据节点数判断的方法,可以见 LeetCode 958,都是这个解法

壑舟 | 园豆:202 (菜鸟二级) | 2022-03-11 11:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册