• leetcode 222. 完全二叉树的节点个数


    题目描述:

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

    说明:

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

    示例:

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

    输出: 6

    思路分析:

    思路一:利用层次遍历的方式,统计节点总数。

    思路二:利用树的高度来求解。

    完全二叉树的高度可以直接通过不断地访问左子树就可以获取
            判断左右子树的高度: 
            如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中)
            如果不等说明右子树是深度小于左子树的满二叉树, 然后进一步判断左子树的节点数(最后一层最后出现的节点必然在左子树中)

    代码:

    思路一:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     void level_order(TreeNode*root, vector<vector<int>>& tmp, int level)
    13     {
    14         if(root == nullptr)
    15             return;
    16         if(tmp.size()<=level)
    17         {
    18             tmp.push_back(vector<int>{});
    19         }
    20         tmp[level].push_back(root->val);
    21         level_order(root->left, tmp, level+1);
    22         level_order(root->right, tmp, level+1);
    23     }
    24     int countNodes(TreeNode* root) {
    25         if(root == nullptr)
    26             return 0;
    27         vector<vector<int>> tmp;
    28         level_order(root, tmp, 0);
    29         int res=0;
    30         for(int i=0; i<tmp.size(); i++)
    31         {
    32             res += tmp[i].size();
    33         }
    34         return res;
    35     }
    36 };

    思路二:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     int get_height(TreeNode* root)
    13     {
    14         if(root == nullptr)
    15             return 0;
    16         int depth=0;
    17         while(root)
    18         {
    19             depth++;
    20             root=root->left;
    21         }
    22         return depth;
    23     }
    24     int countNodes(TreeNode* root) {
    25         if(root == nullptr)
    26             return 0;
    27         int l = get_height(root->left);
    28         int r = get_height(root->right);
    29         if(l==r)
    30             return (1<<l)+countNodes(root->right);// 1(根节点) + (1 << ld)-1(左完全左子树节点数) + 右子树节点数量
    31         else
    32             return (1<<r)+countNodes(root->left);// 1(根节点) + (1 << rd)-1(右完全右子树节点数) + 左子树节点数量
    33         
    34     }
    35 };
  • 相关阅读:
    数据挖掘实践(34):实战--高潜用户购买画像(三)特征工程
    数据挖掘实践(33):实战--高潜用户购买画像(二)EDA/探索性数据分析
    数据挖掘实践(32):实战--高潜用户购买画像(一)数据清洗
    Java 流程控制 之 顺序结构
    Java 之 运算符
    Java 之 变量
    Handmade Rust Part 1: Introduction & Allocators
    rust 强制转换
    引用与借用
    candidate #1: `std::clone::Clone`
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11484933.html
Copyright © 2020-2023  润新知