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

一、题目

image

输入:root = [1,2,3,4,5,6]
输出:6

二、解法

一般的做法是用bfs或dfs遍历节点,时间和空间复杂度是O(n)。

要利用完全二叉树这个性质,首先求出树的层数level(root是0层),然后二分查找,判断最高层节点是否存在。

image

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
        if(root==null) return 0;
        int level=0;
        TreeNode node=root;
        while(node.left!=null){
            level++;
            node=node.left;
        }
        int low=1<<level,high=(1<<(level+1))-1;
        while(low<high){
            int mid=low+(high-low+1)/2;
            if(exists(root,level,mid)){
                low=mid;
            }else{
                high=mid-1;
            }
        }
        return low;
    }

    boolean exists(TreeNode root,int level,int k){
        int bits=1<<(level-1);
        TreeNode node=root;
        while(node!=null&&bits!=0){
            if((k&bits)==0){
                node=node.left;
            }else{
                node=node.right;
            }
            bits>>=1;
        }
        return node!=null;
    }
}
posted @   livingsu  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示