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

我的做法:层序遍历(BFS)

/**
 * 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 sum = 0;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while (!q.isEmpty()) {
            TreeNode topNode = q.poll();
            ++sum;
            if (topNode.left != null) q.offer(topNode.left);
            if (topNode.right != null) q.offer(topNode.right);
        }
        return sum;
    }
}

其他解法:

总体就是判断当前节点引导的子树是不是满二叉,是的话可以直接返回子树结点数,不是的话就往下遍历。

由于完全二叉树的性质,左右子树中最多只有一个子树不是满二叉。

所以总体的时间复杂度仍然是logn ^ 2

这是一棵完全二叉树:除最后一层外,其余层全部铺满;且最后一层向左停靠

如果根节点的左子树深度等于右子树深度,则说明 左子树为满二叉树

222. 完全二叉树的节点个数_第1张图片
如果根节点的左子树深度大于右子树深度,则说明 右子树为满二叉树

222. 完全二叉树的节点个数_第2张图片

如果知道子树是满二叉树,那么就可以轻松得到该子树的节点数目:

(1<<depth) - 1; // depth为子树的深度;为了加快幂的运算速度,可以使用移位操作符

接着我们只需要接着对另一子树递归即可
时间复杂度为 O(logn * logn),空间复杂度为 O(1)

作者:左
链接:https://leetcode.cn/problems/count-complete-tree-nodes/solutions/181466/c-san-chong-fang-fa-jie-jue-wan-quan-er-cha-shu-de/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

/**
 * 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;
        TreeNode node = root;
        int l_depth = 0, r_depth = 0;
        while (root.left != null) {
            ++l_depth; // 2 ^ (depth + 1) - 1
            root = root.left;
        }
        root = node;
        while (root.right != null) {
            ++r_depth;
            root = root.right;
        }
        if (l_depth == r_depth) return (int)Math.pow(2, l_depth + 1) - 1;
        else return countNodes(node.left) + countNodes(node.right) + 1;
    }
}

你可能感兴趣的:(LeetCode,算法,java,数据结构,开发语言)