leetCode(19):Count Complete Tree Nodes

来源:互联网 发布:华为网络 编辑:程序博客网 时间:2024/06/07 06:04

Given a complete binary tree, count the number of nodes.

Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2hnodes inclusive at the last level h.

       代码一适合任何形式的二叉树,代码二和代码三只适合本题所述形式的二叉树。

代码一:最简单,但时间超限

int countNodes(TreeNode* root){if(NULL==root)return 0;int count(0);count=1+countNodes(root->left)+countNodes(root->right);return count;}
代码二:采用层序遍历的方式,统计层数和最后一层结点个数,还是时间超限
<pre name="code" class="cpp">int countNodes(TreeNode* root){queue<TreeNode*> nodes;if(NULL==root)return 0;nodes.push(root);int depth(1);int result(0);while(!nodes.empty()){int length=nodes.size();int i=0;int k(0);while(i<length){TreeNode* tmpNode=nodes.front();nodes.pop();if(tmpNode->left){nodes.push(tmpNode->left);k++;}elsebreak;if(tmpNode->right){nodes.push(tmpNode->right);k++;}elsebreak;i++;}if(i<length){result=(1<<depth)-1+k;break;}depth++;}return result;}

代码三:在代码一上的扩展,在网上看别人的。因为是完全二叉树,所以有且仅有最后一层和倒数第二层有叶子结点。首先统计最左边和最右边的深度,如果深度一致,说明是满二叉树(注意题目条件),则可以直接求出;如果不一致,则分别求左右孩子结点的结点个数。

<pre name="code" class="cpp">/** * 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(NULL==root)    return 0;    int height1(0),height2(0);    TreeNode* p=root;    while(p)    {    p=p->left;    height1++;    }    TreeNode* q=root;    while(q)    {    q=q->right;    height2++;    }    if(height1==height2)    return (1<<height1)-1;    return 1+countNodes(root->left)+countNodes(root->right);    }};




0 0
原创粉丝点击