• LeetCode 222. 完全二叉树节点个数(方法二)


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

    解题思路:前面讲解了递归的方式求解此题。但是递归并没有利用二叉树的性质。在方法二中

    充分利用完全二叉树的性质,并结合二分法来求解此题。完全二叉树除去最后一层,其余层都

    是满的,而且最后一层中的所有节点都集中在左侧。设二叉树的深度为d(这里的d从0开始计数),

    则前d-1层的节点个数为2^d-1,最后只需计算出最后一层的节点的个数将其相加返回即可。

    最后一层的节点都集中在树的左侧,所以可以通过二分法来进行计算。

    其LeetCode C++参考代码如下:

    /**
     * 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){
                  return 0;
              } 
              int d=countDepth(root);
              if(d==0){
                  return 1;
              }
              int left=0,right=pow(2,d)-1;
              while(left<=right){
                  int idx=left+(right-left)/2;
                  if(exist(idx,d,root)){
                      left=idx+1;
                  }
                  else{
                      right=idx-1;
                  }
              }
              return pow(2,d)+ left-1;
        }
    
    
    
        int countDepth(TreeNode* root){
            int d=0;
            while(root->left){
                d+=1;
                root=root->left;
            }
            return d;
        }
        bool exist(int idx,int d,TreeNode* node){
    
           int left=0,right=pow(2,d)-1;
           for(int i=0;i<d;i++){
               int pivot=left+(right-left)/2;
               if(idx<=pivot){
                   right=pivot;
                   node=node->left;
               }
               else{
                   left=pivot+1;
                   node=node->right;
               }
           }
           return node!=NULL;
    
    
    
        }
    
    
    
    
    };
  • 相关阅读:
    JAVA学习前应该了解
    JAVA帝国的诞生
    常用的快捷方式
    MarkDown学习
    运动检测
    图像分割
    感知机
    线性判别函数
    距离
    概率密度估计笔记——非参数估计
  • 原文地址:https://www.cnblogs.com/zzw-/p/13480582.html
Copyright © 2020-2023  润新知