• Leetcode 222:完全二叉树的节点个数


    题目

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

    思路

    1.如果一棵二叉树是完全二叉树,那么二叉树最大深度和右子树的最大深度是相同的话,那么根节点的左子树一定是一棵满二叉树,利用公式即可求出根节点的左子树的节点加上根节点的节点数量。
    2.如果一棵二叉树是完全二叉树,那么二叉树最大深度和右子树的最大深度是不同的话(实际情况就是二叉树的最大深度比其右子树的最大深度大1),那么右子树一定是深度 为二叉树深度减2的满二叉树。
    由上述内容可知,一棵完全二叉树左右子树中至少一个是满二叉树。
    
    

    题解

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    //https://www.jianshu.com/p/62db7c855e44
    class Solution {
    private:
        int height(TreeNode* root){
            if(root == NULL)
                return -1;
            while(root != NULL)
                return height(root->left) + 1;
        }
    public:
        int countNodes(TreeNode* root) {
            int h=height(root);
            int nums=0;
            while(root!=NULL){
                if(h-1==height(root->right)){
                    nums+=1<<h; //相当于pow(2,h - 1)
                    root=root->right;
                }
                else{
                    nums+=1<<h-1;
                    root=root->left;
                }
                h--;
            }
            return nums;
        }
    };
    
    

    reference

  • 相关阅读:
    字符链接
    成绩统计
    看不懂的代码
    新的开始
    appserv 求指教php运行环境
    指针 数组 复制
    HTML 标题居中 小小积累
    用指针 数组连接
    [导入]Hibernate+Spring+Struts2+ExtJS开发CRUD功能
    [导入]Hibernate+Spring+Struts2+ExtJS开发CRUD功能
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/10855615.html
Copyright © 2020-2023  润新知