c-完全二叉树的计算结点总数算法

问题描述

完全二叉树的计算结点总数算法

/**

  • 定义二叉树的结点如下
  • struct TreeNode {
  • int val;
  • struct TreeNode *left;
  • struct TreeNode *right;
  • };
    /
    算法如下:
    int countNodes(struct TreeNode
    root) {
    if(root==NULL)//如果传进一棵空树
    return 0;
    if(root->left==NULL)//如果传进一棵只有根结点的树木
    return 1;
    if(root->right==NULL)//如果这颗树就只有一颗子树
    return 2;
    return (countNodes(root->left)+countNodes(root->right)+1);
    }
    该算法在OJ上面判断出错,说是算法时间超出限制,求解,这个算法错在哪里。

解决方案

int countNodes(struct TreeNode *root)
{

if(root!=NULL)
{
  if(root->left==NULL&&root->right==NULL)//叶子节点
      return 1;
  else //其中至少一个子树不为空,那就意味着可能有多个节点。
      //总节点数是左子树节点数+右子树节点数+1(自身节点)
      return countNodes(root->left)+countNodes(root->right)+1;

}else//如果为空,则说明不存在这个节点,故返回零。
    return 0;

}

您的算法有缺陷的,如楼上所述。
if(root->left==NULL)//如果传进一棵只有根结点的树木 return 1; if(root->right==NULL)//如果这颗树就只有一颗子树 return 2;

这两个if语句是不妥的。

解决方案二:

函数定义不对,应该用指针:int countNodes(struct TreeNode root)

解决方案三:

http://wenku.baidu.com/link?url=ebcfCOsXY-KZ8DnOipbGoqsZerG9Z8wCN6KMO8kuqaTq48ziiqRZTyiFML8nmn-XKICwsP2hnLvMDi3VhuJ4QRoB9hYfmf81yeBGJt8Zkwe

解决方案四:

其实我想要的是算法的分析,各位大神可不可以不要复制黏贴代码,小弟学习数据结构,想要的是解题思路,还有,我怎么看也看不出我的算法那有问题

解决方案五:

应该是分支没有写正确的原因, 三个if都在进行,而不是进入一个两外两个就不进行了,可能是这的问题。试试把代码改成这样

 int countNodes(struct TreeNode root)
{
    if(root==NULL)//如果传进一棵空
    {
        return 0;
    }
    else if(root->left==NULL)//如果传进一棵只有根结点的树木
    {
        return 1;
    }
    else if(root->right==NULL)//如果这颗树就只有一颗子树
    {
        return 2;
    }
    else
    {
        return (countNodes(root->left)+countNodes(root->right)+1);
    }
 }

解决方案六:

楼主 你的算法是有问题的,例如像这样一棵树

           0
            /
        0
       /
     0
     /
 0

只有左孩子,直接在判断右孩子为空的时候就return了。还是分支的问题。

解决方案七:

 #include<stdio.h>

struct BiTree{

    char data;

    struct BiTree *lchild;

    struct BiTree *rchild;

};

struct BiTree* CreatBiTree(){

    char x;

    struct BiTree* p;

    scanf("%c",&x); 

    if(x!='.'){

      p=(struct BiTree*)malloc(sizeof(struct BiTree));

      p->data=x;

      p->lchild=CreatBiTree();

      p->rchild=CreatBiTree();

}

    else

      p=NULL;

      return p;

}

int LeafNum(struct BiTree *T){

    if(!T)

      return 0;

    else

      if(!T->lchild&&!T->rchild)

        return 1;

      else

        return LeafNum(T->lchild)+LeafNum(T->rchild);

}

int main(){

   int num;

   struct BiTree* T;

   printf("Please input the tree(pre):
");

   T=CreatBiTree();

   while(T==NULL){

     printf("empoty,again:
");

       T=CreatBiTree();                                 

       }

   num=LeafNum(T);

   printf("
the sum of leaf is:%d
",num);

   getch();

}

解决方案八:

我觉得使用层次遍历更好。1、使用递归可能会使得超时,所以使用循环。2.对于层次遍历,循环是非常合适的,而对于深度遍历,递归是比较合适的。

解决方案九:

二叉树结点的计算
编写递归算法,计算二叉树中叶子结点的数目

时间: 2024-07-30 15:08:59

c-完全二叉树的计算结点总数算法的相关文章

ASP分页时计算页面总数的几种算法小结_应用技巧

下面是我从网上找到三种ASP分页时计算页面总数的方法,此方法仅为分页时计算页面总数,并非整个分页代码: 方法一 复制代码 代码如下: ' HTMer_RecordCount为要计算的页面总数 ' HTMer_RecordCount为记录集数 ' HTMer_PageSize为每页记录数 If HTMer_RecordCount Mod HTMer_PageSize=0 Then HTMer_PageCount=Int(HTMer_RecordCount/HTMer_PageSize) Else

ASP分页时计算页面总数的几种算法小结

下面是我从网上找到三种ASP分页时计算页面总数的方法,此方法仅为分页时计算页面总数,并非整个分页代码: 方法一 复制代码 代码如下: ' HTMer_RecordCount为要计算的页面总数 ' HTMer_RecordCount为记录集数 ' HTMer_PageSize为每页记录数 If HTMer_RecordCount Mod HTMer_PageSize=0 Then HTMer_PageCount=Int(HTMer_RecordCount/HTMer_PageSize) Else

删除重复结点的算法,哪里错了求解答,运行不了!!

问题描述 删除重复结点的算法,哪里错了求解答,运行不了!! void DeleteList(linklist &L){ linklist pqs; p=L->next ; while(p){ q=p->next; while(q) { if(q->data==p->data ) { s=q; q=s->next; free(s); } else q=q->next ; } p=p->next ;} } 解决方案 void RemoveDupNode(lin

有没有方法能够加速以下计算汉明距离的算法?通过汇编语言?

问题描述 有没有方法能够加速以下计算汉明距离的算法?通过汇编语言? 2C 下面的代码是一个基本的计算汉明距离的C++程序,但由于所设计的应用程序的限制,在使用过程中需要特别多次地使用该算法,为了提高应用效率,是否可以从改进该算法上入手?有没有适当的方法能够提高该算法本身的效率?通过汇编语言有没有实现的可能? unsigned dist(const unsigned char *vec1 const unsigned char *vec2 unsigned dim){ const unsigned

转 大数据实时处理:百分点实时计算架构和算法

当今时代,数据不再昂贵,但从海量数据中获取价值变得昂贵,而要及时获取价值则更加昂贵,这正是大数据实时计算越来越流行的原因.以百分点公司为例,在高峰期每秒钟会有近万HTTP请求发送到百分点服务器上,这些请求包含了用户行为和个性化推荐请求.如何从这些数据中快速挖掘用户兴趣偏好并作出效果不错的推荐呢?这是百分点推荐引擎面临的首要问题.本文将从系统架构和算法两方面全介绍百分点公司在实时计算方面的经验和心得体会,供读者参考. a) 实时计算架构 图 1百分点大数据平台原理示意图 工欲善其事,必先利其器.一

大数据处理:百分点实时计算架构和算法

当今时代,数据不再昂贵,但从海量数据中获取价值变得昂贵,而要及时获取价值则更加昂贵,这正是大数据实时计算越来越流行的原因.以百分点公司为例,在高峰期每秒钟会有近万HTTP请求发送到百分点服务器上,这些请求包含了用户行为和个性化推荐请求.如何从这些数据中快速挖掘用户兴趣偏好并作出效果不错的推荐呢?这是百分点推荐引擎面临的首要问题.本文将从系统架构和算法两方面全介绍百分点公司在实时计算方面的经验和心得体会,供读者参考. a) 实时计算架构 图 1百分点大数据平台原理示意图 工欲善其事,必先利其器.一

三角函数计算,Cordic 算法C实现

http://blog.csdn.net/liyuanbhu/article/details/8458769#t2 三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值.这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如sin(π/2)=1)开始并重复应用半角和和差公式而生成. 现在有了计算机,三角函数表便推出了历史的舞台.但是像我这样的喜欢刨根问底的人,不禁要问计算机又是如何计算三角函数值的呢.最容易想到的办法就是利

VB计算农历的算法

农历|算法 '下面是一个关于VB的农历算法 '日期数据定义方法如下 '前12个字节代表1-12月为大月或是小月,1为大月30天,0为小月29天, '第13位为闰月的情况,1为大月30天,0为小月29天,第14位为闰月的月 '份,如果不是闰月为0,否则给出月份,10.11.12分别用A.B.C来表 '示,即使用16进制.最后4位为当年家农历新年-即农历1月1日所在公历 '的日期,如0131代表1月31日. 'GetYLDate函数使用方式如下tYear为要输入的年,tMonth为月,tDay为 '

《算法导论(原书第3版)》一第1章 算法在计算中的作用 - 1.1 算法

第1章 算法在计算中的作用 什么是算法?为什么算法值得研究?相对于计算机中使用的其他技术来说算法的作用是什么?本章我们将回答这些问题. 1.1 算法 非形式地说,算法(algorithm)就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出.这样算法就是把输入转换成输出的计算步骤的一个序列. 我们也可以把算法看成是用于求解良说明的计算问题的工具.一般来说,问题陈述说明了期望的输入/输出关系.算法则描述一个特定的计算过程来实现该输入/输出关系. 例如,我们可能需