zoukankan      html  css  js  c++  java
  • 222. Count Complete Tree Nodes

    问题:

    计算给定完全二叉树的节点个数。

    Example:
    
    Input: 
        1
       / 
      2   3
     /   /
    4  5 6
    
    Output: 6
    

     

    解法:Complete Binary Tree(完全二叉树) 

    首先明确以下定义:

    • (了解即可)Full Binary Tree
      • 国际定义的 满二叉树
      • 定义:A binary tree in which each node has exactly zero or two children.In other words, every node is either a leaf or has two children. For efficiency, any Huffman coding is a full binary tree.
      •  因此这样的二叉树,也叫做 Full Binary Tree

    • Complete Binary Tree
      • 完全二叉树
      • 定义:A binary tree in which every level, except possibly the deepest, is completely filled. At depth n, the height of the tree, all nodes must be as far left as possible. 
    • Perfect Binary Tree
      • 满二叉树
      • 定义:A binary tree with all leaf nodes at the same depth. All internal nodes have degree 2. 

    本题中,

    • 函数定义  int countNodes(TreeNode* root)
      • 对每一个root节点,求出本身+递归(所有子节点的个数)和。
      • 一般的,= count(1+countNodes(children))
      • ♻️ 优化:若该完全二叉树,特别的,是满二叉树(Perfect Binary Tree):
        • 可求出树高height,总节点个数=2^(height)-1
    • 状态  root
    • 选择  (分别得到左右节点的结果left,right后)
      • return 1+left+right
    • base case
      • if(!root) return 0;

    时间复杂度:

    一般递归次数:树的高度 O(logN)

    每次递归时间:(♻️ 优化 求树高花时间=树高)O(logN)

    因此,总共花时间:O(logN*logN)

    代码参考:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10  * };
    11  */
    12 class Solution {
    13 public:
    14     //recursion
    15     //Def: return the count of node
    16     //     -> full binary tree -> 2^hight-1
    17     //     -> complete binary tree -> tofind left, right tree, recursionly.
    18     //Status: root
    19     //Opt: (after get left,right result)
    20     //    return left+right+1.
    21     //base:
    22     //     root==null: return 0.
    23     int countNodes(TreeNode* root) {
    24         if(!root) return 0;
    25         int lh = 1, rh = 1;
    26         TreeNode* l = root->left;
    27         while(l) {
    28             lh++;
    29             l = l->left;
    30         }
    31         TreeNode* r = root->right;
    32         while(r) {
    33             rh++;
    34             r = r->right;
    35         }
    36         //full binary tree
    37         if(lh==rh) {
    38             return pow(2,lh)-1;//2^hight-1
    39         }
    40         //complete binary tree -> recursion
    41         lh = countNodes(root->left);
    42         rh = countNodes(root->right);
    43         return lh+rh+1;
    44     }
    45 };
  • 相关阅读:
    OpenCV 入门示例之三:AVI 视频播放控制
    CSS3 图标神器 => content:"我是特殊符号"
    【angular5项目积累总结】优秀组件以及应用实例
    基于angular2+ 的 http服务封装
    【angular5项目积累总结】遇到的一些问题以及解决办法
    【angular5项目积累总结】panel组件
    【angular5项目积累总结】http请求服务封装
    【angular5项目积累总结】消息订阅服务
    【angular5项目积累总结】表单复杂校验
    【angular5项目积累总结】列表多选样式框(2)
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13752794.html
Copyright © 2011-2022 走看看