LeetCode——Count Complete Tree Nodes

原创 2015年07月09日 15:07:44

        这个也是讨论区里别人的代码,为免侵权之类的,先在此声明。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
    if (!root) return 0;
    if (!root->left && !root->right) return 1;
    int d = 1; // the depth of the tree
    int leaves = 0;
    int dl, dr;
    while (true){
        if (!root->right){
            leaves++;
            break;
        }
        dl = depth(root->left);
        dr = depth(root->right);
        d = max(d, dl+1);
        // like binary search
        if (dl == dr){
            leaves += 1<<dl;
            root = root->right;
        }
        else{
            root = root->left;
        }

    }
    return (1<<d)-1 + leaves;
}
int depth(TreeNode* root){
    int d = -1;
    while (root){
        d+= 1;
        root = root->left;
    }
    return d;
}
};


       代码的基本思路是先计算出(完全二叉树的层数-1),因为完全二叉树只可能最后一层不满,前d层相当于一个满二叉树,无须遍历节点,即可得节点数量为(1<<d)-1,再加上最后一层的节点数量,即为完全二叉树的节点数。所以代码的变量命名其实是不合适的,leaves变量的值不是叶节点的数量;同时代码中还有小技巧:depth函数中d的初值是-1,也就是说,返回的是(深度-1)。最后一层的节点数如何计算呢?若根节点的左右子树深度相同,就说明左子树是满的,其最后一层的节点数量可用数学公式直接计算,再迭代计算右子树的最后一层节点数;若深度不同,则右子树比左子树少一层,完全二叉树最后一层的节点都在左子树上,于是就是沿着左子树向下,直到某个节点的左右子树深度相同,可用公式计算。能这样做都是因为完全二叉树的性质:最后一层的节点必定是从左到右排列。

        循环什么时候退出呢?当遇到一个节点没有右节点的时候。因为此时,这个节点要么是最后一层的叶节点,要么是一个只有左节点的节点(这样的话其左节点即为最后一层的节点),无论哪种情况,都表明我们对此二叉树的二叉搜索完成了,并令 leaves += 1.

        这份代码我觉得思路还是不错的,揣摩了不少时间才堪堪理解。如果有什么理解错误的地方,欢迎批评指正。

Leetcode[222]-Count Complete Tree Nodes

Given a complete binary tree, count the number of nodes.Definition of a complete binary tree from Wi...
  • Dream_angel_Z
  • Dream_angel_Z
  • 2015年06月11日 13:24
  • 1508

leetcode 222: Count Complete Tree Nodes

leetcode 222: Count Complete Tree Nodes c++ java python
  • xudli
  • xudli
  • 2015年06月06日 05:14
  • 14230

LeetCode222:Count Complete Tree Nodes

Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W...
  • u012501459
  • u012501459
  • 2015年07月29日 17:17
  • 838

LeetCode222 Count CompleteTree Nodes(计算完全二叉树的节点数) Java 题解

题目: Given a complete binary tree, count the number of nodes. Definition of a complete binary...
  • u012249528
  • u012249528
  • 2015年07月09日 20:51
  • 1219

【Leetcode】Count Complete Tree Nodes

题目链接:https://leetcode.com/problems/count-complete-tree-nodes/ 题目: Given a complete binary tree, co...
  • yeqiuzs
  • yeqiuzs
  • 2015年11月24日 15:19
  • 356

leetcode Count Complete Tree Nodes

对于每个节点如果左子树的高度等于右子树的高度,则直接套公式2^h-1,否则等于左子树的结点数量+右子树的结点数量+1 public class Solution {     public int ...
  • eshaoliu
  • eshaoliu
  • 2015年06月16日 20:34
  • 290

[leetcode]Count Complete Tree Nodes

[leetcode]Count Complete Tree Nodes
  • u012505618
  • u012505618
  • 2015年11月20日 10:49
  • 197

Leetcode: Count Complete Tree Nodes

Given a complete binary tree, count the number of nodes.Definition of a complete binary tree from Wi...
  • loushuai
  • loushuai
  • 2015年06月06日 20:19
  • 272

LeetCode - Count Complete Tree Nodes

Given a complete binary tree, count the number of nodes. Definition of a complete binary tree fro...
  • fenx91
  • fenx91
  • 2015年07月21日 13:44
  • 200

Leetcode Count Complete Tree Nodes

Leetcode Count Complete Tree Nodes,本算法主要可以使用二分搜索加速计算出最后一层最右边缺少的结点数,通过二分法,计算量变为O(h * h),其中h为树高,相对递归等方...
  • u010842603
  • u010842603
  • 2015年12月08日 11:58
  • 279
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode——Count Complete Tree Nodes
举报原因:
原因补充:

(最多只允许输入30个字)