Leetcode:222. Count Complete Tree Nodes

题目:给定一颗完全二叉树,就算共有多少节点

1.首次尝试
拿到题目第一反应觉得很简单啊,刷刷刷写下如下代码:

class Solution {
public:
    int countNodes(TreeNode* root) {
        if(!root) return 0;
        if(!root->left && !root->right) return 1;
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
};

一边写还想,就这破题目还hard难度,开玩笑吧。
结果一提交,发现超时。。。
然后仔细一想,发现没有利用到完全二叉树这个条件。上面代码可以计算任意二叉树的节点数量,但是对于完全二叉树这么老老实实地计算就太慢了。

2.第二次尝试
可以这样:从根节点一直向左,计算左边的高度;从根节点一直向右,计算右边的高度。如果两边高度一样,那么说明完全二叉树最下面一层也是满的,用公式就算就行了。如果两边高度不一样,即左边比右边高一,那么关键就在于确定树的最下面一层有多少叶子。
我的想法是这样:用类似二分查找的方法,确定最下面一层的分界点在哪。那么对于一颗树,如何找到从根到最下面一层位于中间的节点(如果最下面一层没有,那就倒数第二层位于中间的节点)的高度呢?这样:从根往左走一个,然后一直往右走,就可以了。
以上想法应该是可行的,但是代码实现起来太复杂,无奈作罢。

3.评论区答案

class Solution {
public:
    int countNodes(TreeNode* root) {
        if (!root) return 0;
        int lh = 0, rh = 0;
        auto ln = root;
        auto rn = root;
        while(ln) { ++lh; ln = ln->left; }
        while(rn) { ++rh; rn = rn->right; }
        if(lh == rh) return pow(2, lh)-1;
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
};

核心要点就是一个:一棵完全二叉树的两棵子树都是完全二叉树。
计算两边的高度,如果两边高相等,那么直接通过公式计算出来;如果不相等,那么就递归计算左右子树的节点数量再加一。
看到答案真的是要给跪了orz

猜你喜欢

转载自blog.csdn.net/weixin_43462819/article/details/84035667