第9周项目3 利用二叉树遍历思想解决问题(1)

来源:互联网 发布:mac版ps存储快捷键 编辑:程序博客网 时间:2024/06/06 10:50
#include <stdio.h>  #include "btree.h"    int Nodes(BTNode *b)  //计算二叉树节点个数  {      if (b==NULL)          return 0;      else          return Nodes(b->lchild)+Nodes(b->rchild)+1;  }  void DispLeaf(BTNode *b)  //输出所有叶子节点  {      if (b!=NULL)      {          if (b->lchild==NULL && b->rchild==NULL)              printf("%c ",b->data);          else          {              DispLeaf(b->lchild);              DispLeaf(b->rchild);          }      }  }  int LeafNodes(BTNode *b)  //求二叉树b的叶子节点个数  {      int num1,num2;      if (b==NULL)          return 0;      else if (b->lchild==NULL && b->rchild==NULL)          return 1;      else      {          num1=LeafNodes(b->lchild);          num2=LeafNodes(b->rchild);          return (num1+num2);      }  }  int Level(BTNode *b,ElemType x,int h)  //返回二叉链b中data值为x的节点的层数h  {      int l;      if (b==NULL)          return 0;      else if (b->data==x)          return h;      else      {          l=Level(b->lchild,x,h+1);          if (l==0)                    //在左子树中没找到data值为x的节点,继续在右子树中寻找值为x的节点              return Level(b->rchild,x,h+1);          else              return l;                //在左子树中已经找到data值为x的节点即返回层数l      }  }    int main()  {      BTNode *b;      CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");      printf("二叉树节点个数: %d\n", Nodes(b));      printf("二叉树中所有的叶子节点是: ");      DispLeaf(b);      printf("\n");      printf("二叉树b的叶子节点个数: %d\n",LeafNodes(b));      printf("值为\'K\'的节点在二叉树中出现在第 %d 层上",Level(b,'K',1));        DestroyBTNode(b);      return 0;  }  


#ifndef BTREE_H_INCLUDED  #define BTREE_H_INCLUDED    #define MaxSize 100  typedef char ElemType;  typedef struct node  {      ElemType data;              //数据元素      struct node *lchild;        //指向左孩子      struct node *rchild;        //指向右孩子  } BTNode;  void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链  BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针  BTNode *LchildNode(BTNode *p);      //返回*p节点的左孩子节点指针  BTNode *RchildNode(BTNode *p);      //返回*p节点的右孩子节点指针  int BTNodeDepth(BTNode *b);     //求二叉树b的深度  void DispBTNode(BTNode *b);     //以括号表示法输出二叉树  void DestroyBTNode(BTNode *&b);     //销毁二叉树    #endif // BTREE_H_INCLUDED  


#include <stdio.h>  #include <malloc.h>  #include "btree.h"    void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链  {      BTNode *St[MaxSize],*p=NULL;      int top=-1,k,j=0;      char ch;      b=NULL;             //建立的二叉树初始时为空      ch=str[j];      while (ch!='\0')    //str未扫描完时循环      {          switch(ch)          {          case '(':              top++;              St[top]=p;              k=1;              break;      //为左节点          case ')':              top--;              break;          case ',':              k=2;              break;                          //为右节点          default:              p=(BTNode *)malloc(sizeof(BTNode));              p->data=ch;              p->lchild=p->rchild=NULL;              if (b==NULL)                    //p指向二叉树的根节点                  b=p;              else                            //已建立二叉树根节点              {                  switch(k)                  {                  case 1:                      St[top]->lchild=p;                      break;                  case 2:                      St[top]->rchild=p;                      break;                  }              }          }          j++;          ch=str[j];      }  }  BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针  {      BTNode *p;      if (b==NULL)          return NULL;      else if (b->data==x)          return b;      else      {          p=FindNode(b->lchild,x);          if (p!=NULL)              return p;          else              return FindNode(b->rchild,x);      }  }  BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针  {      return p->lchild;  }  BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针  {      return p->rchild;  }  int BTNodeDepth(BTNode *b)  //求二叉树b的深度  {      int lchilddep,rchilddep;      if (b==NULL)          return(0);                          //空树的高度为0      else      {          lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep          rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep          return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);      }  }  void DispBTNode(BTNode *b)  //以括号表示法输出二叉树  {      if (b!=NULL)      {          printf("%c",b->data);          if (b->lchild!=NULL || b->rchild!=NULL)          {              printf("(");              DispBTNode(b->lchild);              if (b->rchild!=NULL) printf(",");              DispBTNode(b->rchild);              printf(")");          }      }  }  void DestroyBTNode(BTNode *&b)   //销毁二叉树  {      if (b!=NULL)      {          DestroyBTNode(b->lchild);          DestroyBTNode(b->rchild);          free(b);      }  }  
运行结果:




阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 妹妹初中毕业谈恋爱怎么办 原告的证据造假怎么办 慕课考试不及格怎么办 大学高数不及格怎么办 对方拒绝司法调解怎么办? cas授权已过期怎么办 英法巡航南海中国怎么办 wps文件不能改怎么办 wps不能删除内容怎么办 word文件被锁定怎么办 word批注不显示怎么办 wps怎么办把修订取消 审阅密码忘了怎么办 psv关机后怎么办刷 被螃蟹扎了怎么办 被海鲜划伤出血怎么办 海域使用证缴纳金没交怎么办 海峡中线 金门海域怎么办 对工作失去热情怎么办 取款机多出钱怎么办 风扇声音很响怎么办 稳压器输出没电怎么办 稳压器不稳10压怎么办 dnf凯蒂不见了怎么办 马桶里掉进塑料瓶盖怎么办 塑料瓶子盖子打不开怎么办 按压瓶盖坏了怎么办 瓶盖拧错位了怎么办 红酒盖子开不了怎么办 胶盖罐头打不开怎么办 玻璃瓶的塑料盖打不开怎么办 香水按压不出来怎么办 电高压锅盖子打不开怎么办 杯子螺口错位怎么办 散粉盖子扭不开怎么办 玻璃瓶饮料盖子打不开怎么办 玻璃瓶玻璃盖子打不开怎么办 美甲没有胶水怎么办 按压式瓶盖打不开怎么办 睫毛胶水瓶盖打不开怎么办 玻璃杯盖子滑丝怎么办