zoukankan      html  css  js  c++  java
  • leetCode(19):Count Complete Tree Nodes 分类: leetCode 2015-06-22 08:32 222人阅读 评论(0) 收藏

    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++;
    			}
    			else
    				break;
    			if(tmpNode->right)
    			{
    				nodes.push(tmpNode->right);
    				k++;
    			}
    			else
    				break;
    			
    			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);
        }
    };


    
    

  • 相关阅读:
    hdu 4114 Disney's FastPass 状压dp
    lightoj 1381
    bzoj 2428: [HAOI2006]均分数据 随机化
    bzoj 3969: [WF2013]Low Power 二分
    套题:wf2013 (1/8)
    hdu 4119 Isabella's Message 模拟题
    hdu 4118 Holiday's Accommodation 树形dp
    UESTC 2015dp专题 N 导弹拦截 dp
    UESTC 2015dp专题 j 男神的约会 bfs
    UESTC 2015dp专题 H 邱老师选妹子 数位dp
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687096.html
Copyright © 2011-2022 走看看