• 二叉树高度、宽度、结点个数、叶子结点个数


    实现二叉树宽度递归算法~

      1 #include <iostream>
      2 using namespace std;
      3 typedef struct node
      4 {
      5 char data;
      6 int lab;
      7 struct node *lchild;
      8 struct node *rchild;
      9 }btree;
     10 int m=0;
     11 void ct(btree *&b,char *str)
     12 {
     13 btree *st[99],*p=NULL;
     14 int top=-1,k,j=0;
     15 char ch;
     16 b=NULL;
     17 ch=str[j];
     18 while(ch!='\0')
     19 {
     20    switch(ch)
     21    {
     22    case '(':top++;st[top]=p;k=1;break;
     23    case ')':top--;break;
     24    case ',':k=2;break;
     25    default:p=(btree *)malloc(sizeof(btree));
     26     p->data=ch;
     27     p->lchild=p->rchild=NULL;
     28     if(b==NULL)
     29      b=p;
     30     else
     31     {
     32      switch(k)
     33      {
     34      case 1:st[top]->lchild=p;break;
     35      case 2:st[top]->rchild=p;break;
     36      }
     37     }
     38    }
     39    j++;
     40    ch=str[j]; 
     41 }
     42 }
     43 void outbt(btree *b)
     44 {
     45 if(b!=NULL)
     46 {
     47    cout<<b->data;
     48    outbt(b->lchild);
     49    outbt(b->rchild);
     50 }
     51 }
     52 btree *findchild(btree *b,char x)
     53 {
     54 btree *p;
     55 if(b==NULL)
     56 {
     57    return NULL;
     58 }
     59 else
     60    if(b->data==x)
     61    {
     62     cout<<"找到结点"<<x<<"!"<<endl;
     63     if(b->lchild==NULL)
     64      cout<<"左节点为空!"<<endl;
     65     else
     66      cout<<"左孩子为:"<<b->lchild->data<<endl;
     67     if(b->rchild==NULL)
     68      cout<<"右孩子为空!"<<endl;
     69     else
     70      cout<<"右孩子为:"<<b->rchild->data<<endl;
     71     return b;
     72    }
     73    else
     74    {
     75     p=findchild(b->lchild,x);
     76     if(p!=NULL)
     77      return p;
     78     else
     79      return findchild(b->rchild,x);
     80    }
     81 }
     82 int btreeheight(btree *b)
     83 {
     84 int lchildh,rchildh;
     85 if(b==NULL)
     86    return(0);
     87 else
     88 {
     89    lchildh=btreeheight(b->lchild);
     90    rchildh=btreeheight(b->rchild);
     91    return(lchildh>rchildh?(lchildh+1):(rchildh+1));
     92 }
     93 }
     94 int i=-1,a[20];
     95 void btreewide(btree *b)
     96 {
     97 if(b!=NULL)
     98 {
     99    if(b->lchild!=NULL)
    100    {
    101     i++;
    102     b->lchild->lab=b->lab+1;
    103     a[i]=b->lab+1;
    104    }
    105    if(b->rchild!=NULL)
    106    {
    107     i++;
    108     b->rchild->lab=b->lab+1;
    109     a[i]=b->lab+1;
    110    }
    111    btreewide(b->lchild);
    112    btreewide(b->rchild);
    113 }
    114 }
    115 void vernum(btree *b)
    116 {
    117 if(b!=NULL)
    118 {
    119    m++;
    120    vernum(b->lchild);
    121    vernum(b->rchild);
    122 }
    123 }
    124 int leafver(btree *b)
    125 { 
    126     if(b==NULL)
    127    return 0;
    128     else 
    129    if(b->lchild==NULL&&b->rchild==NULL)
    130     return 1;
    131         else 
    132     return leafver(b->lchild)+leafver(b->rchild); 
    133 }
    134 void main()
    135 {
    136 char *s;
    137 s="A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))";
    138 btree *bt;
    139 cout<<"将要创建的二叉树:"<<endl<<s<<endl;
    140 ct(bt,s);
    141 cout<<"输出二叉树:"<<endl;
    142 outbt(bt);
    143 cout<<endl;
    144 cout<<"H结点左右孩子结点值:"<<endl;
    145 findchild(bt,'H');
    146 cout<<"二叉树的深度:"<<btreeheight(bt)<<endl;
    147 vernum(bt);
    148 cout<<"二叉树结点个数:"<<m<<endl;
    149 cout<<"二叉树叶子结点个数:"<<leafver(bt)<<endl;
    150 bt->lab=1;
    151 btreewide(bt);
    152 int j,k,num,max=0;
    153 for(j=1;j<=i+1;j++)
    154 {
    155    num=0;
    156    for(k=0;k<=i;k++)
    157     if(a[k]==j)
    158      num++;
    159    if(max<num)
    160    {
    161     max=num;
    162    }
    163 }
    164 cout<<"二叉树宽度为:"<<max<<endl;
    165 }
  • 相关阅读:
    哈希算法是怎么实现的
    高并发下日志组件的各种实现方式
    算法是如何影响程序编码方式的
    <<.NET B/S 架构实践>> 几种概念区别
    如何扩大系统盘空间
    区别:ASP.NET MVC的Model、DTO、Command
    能递归检查DataAnnotations的验证函数
    NuGet的本地服务器安装与Package的发布(呕吐)
    多模块分布式系统的简单服务访问
    多模块后带来的问题解决方法
  • 原文地址:https://www.cnblogs.com/mellowsmile/p/4382579.html
Copyright © 2020-2023  润新知