zoukankan      html  css  js  c++  java
  • 【LeetCode-树】完全二叉树的节点个数

    题目描述

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

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

    题目链接: https://leetcode-cn.com/problems/count-complete-tree-nodes/

    思路1

    使用 dfs。代码如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int countNodes(TreeNode* root) {
            if(root==nullptr) return 0;
    
            return countNodes(root->left)+countNodes(root->right)+1;
        }
    };
    

    思路2

    使用bfs。代码如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int countNodes(TreeNode* root) {
            if(root==nullptr) return 0;
    
            queue<TreeNode*> q;
            q.push(root);
            int cnt = 0;
            while(!q.empty()){
                TreeNode* node = q.front(); q.pop();
                cnt++;
                if(node->left!=nullptr) q.push(node->left);
                if(node->right!=nullptr) q.push(node->right);
            }
            return cnt;
        }
    };
    

    思路3

    上面的两种方法都是使用遍历来做,没有使用到完全二叉树的性质。

    完全二叉树是一棵空树或者它的叶子节点只出在最后两层,若最后一层不满则叶子节点只在最左侧。如果每一层的节点都是满的,则称为满二叉树。对于一个高度为 d 的满二叉树来讲,树中节点的个数为 (2^d-1)

    对于完全二叉树中的一个节点:

    • 如果该节点左子树的高度等于该节点右子树的高度,都是 h,则说明该节点的左子树是满的,通过公式 (2^h-1) 计算左子树的节点个数,再加上根节点共 (2^h) 个节点,然后递归计算右子树的节点个数;
    • 如果左子树的高度不等于右子树的高度,则说明最后一层不满,但倒数第 2 层满了,可以通过公式计算右子树的节点个数并递归计算左子树的节点个数。

    代码如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int countNodes(TreeNode* root) {
            if(root==nullptr) return 0;
    
            int left = getHeight(root->left);
            int right = getHeight(root->right);
            if(left==right){
                return pow(2, left) + countNodes(root->right);
            }else{
                return pow(2, right) + countNodes(root->left);
            }
        }
        
        int getHeight(TreeNode* root){
            if(root==nullptr) return 0;
            return max(getHeight(root->left)+1, getHeight(root->right)+1);
        }
    };
    

    参考

    https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/chang-gui-jie-fa-he-ji-bai-100de-javajie-fa-by-xia/

  • 相关阅读:
    (转)详谈高端内存和低端内存
    高级声明------定义一个函数指针数组指针
    A Bug's Life POJ
    How Many Answers Are Wrong HDU
    A
    B
    数据处理----离散化
    Serval and Parenthesis Sequence CodeForces
    D
    C
  • 原文地址:https://www.cnblogs.com/flix/p/13295740.html
Copyright © 2011-2022 走看看