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

题目描述

给出一个完全二叉树,求出该树的节点个数。
相关话题: 树、二分查找   难度: 中等
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含1~ 2h 个节点。

示例:

leetcode 222. 完全二叉树的节点个数_第1张图片
  • 递归
    可以说,对递归的执行过程多少有点懵逼,在leetcode129我说例如本题另起了一个函数sumNumbers(TreeNode root, int sum)。因为在算一条路径的值时,是一种自底向上的递归,需要接受上一步传递下来的结果,是一步一步更新的过程,所以需要sum的辅助。
    这道题我第一时间也是想着定义一个变量count随着递归累加,
    错误做法
class Solution {
    public int countNodes(TreeNode root) {
        return countNodes(root,0);
    }
    public int countNodes(TreeNode root,int count) {
       //这个返回条件就是个大大的错误
        if(root == null) return count;//返回一条路径的节点总数
        count += 1;
        return countNodes(root.left,count) + countNodes(root.right,count);
    }
}
leetcode 222. 完全二叉树的节点个数_第2张图片

这样必定会算了很多重复的节点,貌似不好确定边界,除非定义一个数组类型的变量通过先序遍历每遍历到一个节点累加1。

class Solution {
    public int countNodes(TreeNode root) {
        return countNodes(root,new int[1]);
    }
    public int countNodes(TreeNode root,int[] count) {
        if(root == null) return 0;
        count[0] += 1;
        countNodes(root.left,count);
        countNodes(root.right,count);
        return count[0];
    }
}
leetcode 222. 完全二叉树的节点个数_第3张图片
  • 优雅递归
    自顶向下,想求整棵树的节点树,就先要求左子树和右子树的节点数,然后加上根节点1,就是最后的结果了。这个斐波那契数列的求法一样的,是一个递推的过程。
class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) return 0;
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

总结:递归使我懵逼,研究返回条件和返回后的状态。

你可能感兴趣的:(leetcode 222. 完全二叉树的节点个数)