Loading

【力扣】222. 完全二叉树的节点个数

给出一个完全二叉树,求出该树的节点个数。

说明:

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例:

输入:
1
/ \
2 3
/ \ /
4 5 6

输出: 6


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-complete-tree-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

使用递归:

时间复杂度、空间复杂度都O(n)

class Solution {

    int number = 0;
    public int countNodes(TreeNode root) {
        if(root == null){
            return number;
        }
        dfs(root);
        return number;
    }

    public void dfs(TreeNode root){
        if(root == null){
            return;
        }
        number++;
        dfs(root.left);
        dfs(root.right);
    }
}

 

 

但并没有使用完全二叉树的特点

public int countNodes(TreeNode root) {
        

        //如何利用完全二叉树的特点

        //首先算出来当前二叉树的高度
        int tree = treeHeight(root);

        if(tree == 0 || tree == 1){
            //如果树的高度是 0 或者1 则直接返回
            return tree;
        }

        //再计算出右子树的高度
        int rightTree = treeHeight(root.right);

        //如果右子树的高度和整个树的高度 -2 相等,那么说明,这棵树的右子树为满二叉树
        if(rightTree == tree - 2){
            //那么这个二叉树的右子树的节点个数就是固定的
            //那么只需要关心左子树的节点的个数了
            return (1 << rightTree) + countNodes(root.left);
        } else {
            //如果右子树的个数是 整个树的高度 -1 相等,那么说明,这个树的左子树是满二叉树
            //那么就只需要关心右子树的节点的个数了
            return (1 << (tree - 1)) + countNodes(root.right);
        }
    }

 

参考:https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/javadai-ma-tu-wen-xiang-jie-ji-bai-liao-100de-yong/

 

posted @ 2020-11-25 10:54  冯廷鑫  阅读(193)  评论(0编辑  收藏  举报