1. 程式人生 > 遊戲攻略 >《原神攻略》淵下宮厄瑞玻斯的祕密系列任務攻略

《原神攻略》淵下宮厄瑞玻斯的祕密系列任務攻略

一、題目

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

二、解法

一般的做法是用bfs或dfs遍歷節點,時間和空間複雜度是O(n)。

要利用完全二叉樹這個性質,首先求出樹的層數level(root是0層),然後二分查詢,判斷最高層節點是否存在。

/**
 * 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;
    }
}