222. 完全二叉树的节点个数
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-complete-tree-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归
class Solution {
    private int getHeight(TreeNode root) {
        int cnt = 0;
        while (root != null) {
            cnt++;
            root = root.left;
        }
        return cnt;
    }
    private int solve(TreeNode root, int height) {
        if (root == null) {
            return 0;
        }
        int leftHeight = height - 1, rightHeight = getHeight(root.right);
        if (leftHeight == rightHeight) {
            return (1 << leftHeight) + solve(root.right, rightHeight);
        } else {
            return (1 << rightHeight) + solve(root.left, leftHeight);
        }
    }
    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return solve(root, getHeight(root));
    }
}
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 {
    private int getHeight(TreeNode root) {
        int cnt = 0;
        while (root != null) {
            cnt++;
            root = root.left;
        }
        return cnt;
    }
    /**
     * 判断二叉树是否包含num个节点
     *
     * @param root
     * @param level
     * @param num
     * @return
     */
    private boolean exists(TreeNode root, int level, int num) {
        /**
         * 第二层开始
         */
        int bits = 1 << (level - 2);
        while (root != null && bits > 0) {
            /**
             * num的bit位是1,向右移动
             */
            if ((bits & num) != 0) {
                root = root.right;
            } else {
                root = root.left;
            }
            /**
             * 继续下一层
             */
            bits >>= 1;
        }
        return root != null;
    }
    private int search(TreeNode root, int level, int low, int high) {
        int ret = low;
        while (low <= high) {
            int mid = (low + high) >> 1;
            if (exists(root, level, mid)) {
                ret = mid;
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return ret;
    }
    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        /**
         * 二叉树层数
         */
        int level = getHeight(root);
        /**
         * 节点数下节
         */
        int low = 1 << (level - 1);
        /**
         * 节点数上界
         */
        int high = (1 << level) - 1;
        return search(root, level, low, high);
    }
}
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;
    }
}
    心之所向,素履以往 生如逆旅,一苇以航

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号