力扣222题(完全二叉树的节点个数)

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

基本思想:

递归

具体实现:

普通二叉树求节点个数

1.递归参数以及返回值

参数:根节点

返回值:以该节点为根节点的二叉树的节点数量

2.递归终止条件

遍历到空节点的话,返回0,表明节点数为0

3.单层递归的逻辑

先求左子树节点数量,再求右子树节点数量,最后取总再加1(当前节点)

完全二叉树求节点个数

两种情况:

1.满二叉树,节点个数 = 2^树深度-1

2.分别递归左孩子和右孩子,低轨道某一深度会有左孩子或右孩子是满二叉树,按照情况1来算

代码:

普通二叉树求节点个数

class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return countNodes(root.left) + countNodes(root.right) +1;
    }
}

完全二叉树求节点个数

class Solution {
    /**
     * 针对完全二叉树的解法
     *
     * 满二叉树的结点数为:2^depth - 1
     */
    public int countNodes(TreeNode root) {
        TreeNode l = root, r = root;
        int hl = 0, hr = 0;
        while (l != null){
            l = l.left;
            hl++;
        }
        while (r != null){
            r = r.right;
            hr++;
        }
        if(hl == hr){
            return (int)Math.pow(2,hl) -1;
        }
        return 1 + countNodes(root.left) + countNodes(root.right);
    }
}
class Solution {
    //迭代法
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int result = 0;
        while (!queue.isEmpty()){
            int size = queue.size();
            while(size-- > 0){
                TreeNode cur = queue.poll();
                result++;
                if (cur.left != null) queue.offer(cur.left);
                if (cur.right != null) queue.offer(cur.right);
            }
        }
        return result;
    }
}
原文地址:https://www.cnblogs.com/zhaojiayu/p/15376462.html