树和二叉树的存储结构的实现(C/C++实现)

存档:

 1 #include 
 2 #include 
 3 #include 
 4 #define max 20
 5 typedef char elemtype;
 6 #include "tree.h"
 7 void main()
 8 {
 9     btree t,p;
10     char x;
11     int i=0,num=0;
12     cout<<"(1)初始化二叉树initbt(t):"<<endl;
13     initbt(t);
14     cout<<"(2)输入先序遍历序列,创建二叉树(空树以#表示)createbt(t):"<<endl;
15     createbt(t);
16     cout<<"判断二叉树是否为空树emptybt(t):";
17     i=emptybt(t);
18     if(i==1)
19         cout<<"二叉树为空树!"<<endl;
20     else
21         cout<<"二叉树非空!"<<endl;
22     cout<<"(4)输出二叉树的括号描述displaybt(t):";
23     displaybt(t);
24     cout<<endl;
25     cout<<"(5)二叉树的深度depthbt(t)为:"<endl;
26     cout<<"(6)二叉树的叶子结点的个数leafcount(t,num)为:";
27     leafcount(t,num);
28     cout<endl;
29     cout<<"(7)二叉树的结点总个数nodecount(t)为:"<endl;
30     cout<<"(8)先序遍历preorder(t)的结果为:";
31     preorder(t);
32     cout<<endl;
33     cout<<"(9)中序遍历inorder(t)的结果为:";
34     inorder(t);
35     cout<<endl;
36     cout<<"(10)后序遍历postorder(t)的结果为:";
37     postorder(t);
38     cout<<endl;
39     cout<<"(11)层次遍历levelorder(t)的结果为:";
40     levelorder(t);
41     cout<<endl;
42     fflush(stdin);//清空缓存
43     cout<<"(12)输入一个字符,并在树中查找该字符是否存在findnode(t,x):";
44     cin>>x;
45     if(findnode(t,x))
46         cout<<"字符存在!";
47     else 
48         cout<<"字符不存在!";
49     cout<<endl;
50     cout<<"(13)字符"<"对应结点findnode1(t,x)的孩子为:"<<endl;
51     p=findnode1(t,x);
52     if(p!=NULL)
53     {
54         if(p->lchild!=NULL)
55             cout<"左孩子为:"<lchild->data<<" ";
56         else
57             cout<"无左孩子"<<" ";
58         if(p->rchild!=NULL)
59             cout<"右孩子为:"<rchild->data<<endl;
60         else
61             cout<"无右孩子"<<endl;
62     }
63     else
64         cout<"不存在"<<endl;
65     cout<<"(14)清空clearbt(t)的结果为:";
66     clearbt(t);
67     if(emptybt(t))
68         cout<<"二叉树为空树!"<<endl;
69     else
70         cout<<"二叉树非空!"<<endl;
71     cout<<"(15)按照二叉树的括号描述createbt1(t,str)创建二叉树A(B(D,E),C(,F))";
72     createbt1(t,"A(B(D,E),C(,F))");
73     cout<<endl;
74     cout<<"输出二叉树的括号描述displaybt(t):";
75     displaybt(t);
76     cout<<endl;
77     cout<<"先序遍历preorder(t)的结果为:";
78     preorder(t);
79     cout<<endl;
80     cout<<"中序遍历inorder(t)的结果为:";
81     inorder(t);
82     cout<<endl;
83     clearbt(t);
84     system("pause");
85 }
  1 struct node
  2 {
  3     elemtype data;//数据元素
  4     struct node *lchild;//指向左孩子
  5     struct node *rchild;//指向右孩子
  6 };
  7 typedef struct node btnode;//定义结构体的别名btnode
  8 typedef struct node *btree;//定义结构体指针的别名btree
  9 void initbt(btree &t)//初始化函数,构造一棵空树
 10 {
 11     t=NULL;
 12 }
 13 void createbt(btree &t)//先序遍历序列创建二叉树
 14 {
 15     elemtype ch;
 16     cin>>ch;
 17     if(ch=='#')
 18         t=NULL;//#表示空树,递归终止
 19     else
 20     {
 21         t=new btnode;//创建新结点
 22         if(t==NULL)//如果创建结点失败,就退出
 23             exit(-2);
 24         t->data=ch;//生成根结点
 25         createbt(t->lchild);//构造左子树
 26         createbt(t->rchild);//构造右子树
 27     }
 28 }
 29 int emptybt(btree t)//判断树是否为空树
 30 {
 31     if(t==NULL)
 32         return 1;//空树返回1
 33     else 
 34         return 0;//非空树返回0
 35 }
 36 int depthbt(btree t)//求二叉树t的深度
 37 {
 38     if(t==NULL)
 39         return 0;//空树深度为0
 40     else 
 41     {
 42         int depthl=depthbt(t->lchild);//求左子树的高度为depthl
 43         int depthr=depthbt(t->rchild);//求右子树的高度为depthr
 44         return 1+(depthl>depthr?depthl:depthr);//子树深度最大的+1
 45     }
 46 }
 47 int findnode(btree t,elemtype x)//仿照先序遍历,查找data域为x的结点是否存在
 48 {
 49     int i;
 50     if(t==NULL)
 51         return 0;//t为空树,无结点,不存在x,返回0
 52     else if(t->data==x)//t结点恰好是x对应结点,返回1
 53         return 1;
 54     else
 55     {
 56         i=findnode(t->lchild,x);//在左子树中去查找x
 57         if(i!=0)//如果找到了就返回
 58             return i;
 59         else 
 60             return findnode(t->rchild,x);//没找到就去右子树中查找x
 61     }
 62 }
 63 btree findnode1(btree t,elemtype x)//仿照先序遍历,查找data域为x的结点,返回结点指针
 64 {
 65     btree p;
 66     if(t==NULL)
 67         return NULL;//t为空树,不存在x,返回NULL
 68     else if(t->data==x)//t结点恰好是x对应结点,返回t
 69         return t;
 70     else
 71     {
 72         p=findnode1(t->lchild,x);//在左子树中去查找x
 73         if(p!=NULL)//如果找到了就返回
 74             return p;
 75         else 
 76             return findnode1(t->rchild,x);//没找到就去右子树中查找x
 77     }
 78 }
 79 void preorder(btree t)//先序遍历的递归算法
 80 {
 81     if(t!=NULL)
 82     {
 83         cout<data<<' ';//访问根结点
 84         preorder(t->lchild);//递归访问左子树
 85         preorder(t->rchild);//递归访问右子树
 86     }
 87 }
 88 void inorder(btree t)//中序遍历的递归算法
 89 {
 90     if(t!=NULL)
 91     {
 92         inorder(t->lchild);//递归访问左子树
 93         cout<data<<' ';//访问根结点
 94         inorder(t->rchild);//递归访问右子树
 95     }
 96 }
 97 void postorder(btree t)//后序遍历的递归算法
 98 {
 99     if(t!=NULL)
100     {
101         postorder(t->lchild);//递归访问左子树
102         postorder(t->rchild);//递归访问右子树
103         cout<data<<' ';//访问根结点
104     }
105 }
106 void clearbt(btree &t)//仿照后序遍历的递归算法
107 {
108     if(t!=NULL)
109     {
110         clearbt(t->lchild);//先清空左子树
111         clearbt(t->rchild);//后清空右子树
112         delete t;//删除根结点
113         t=NULL;
114     }
115 }
116 void levelorder(btree t)//借助循环队列的原理,实现层次遍历
117 {
118     btree queue[max];//定义循环队列
119     int front,rear;//定义队首和队尾指针
120     front=rear=0;//置队列为空队列
121     if(t!=NULL)
122         cout<data<<' ';//先访问再入队列
123     queue[rear]=t;
124     rear++;//结点指针入队列
125     while(rear!=front)//队列不为空,继续循环
126     {
127         t=queue[front];//队头出队列
128         front=(front+1)%max;
129         if(t->lchild!=NULL)//输出左孩子,并入队列
130         {
131             cout<lchild->data<<' ';
132             queue[rear]=t->lchild;
133             rear=(rear+1)%max;
134         }
135         if(t->rchild!=NULL)//输出右孩子,并入队列
136         {
137             cout<rchild->data<<' ';
138             queue[rear]=t->rchild;
139             rear=(rear+1)%max;
140         }
141     }
142 }
143 int nodecount(btree t)//求二叉树t的结点个数
144 {
145     int num1,num2;
146     if(t==NULL)
147         return 0;//空树结点个数为0
148     else
149     {
150         num1=nodecount(t->lchild);//左子树结点个数
151         num2=nodecount(t->rchild);//右子树结点个数
152         return (num1+num2+1);//左子树+右子树+1
153     }
154 }
155 void leafcount(btree t,int &count)//求二叉树t的叶子结点的个数
156 {
157     if(t!=NULL)
158     {
159         if(t->lchild==NULL&&t->rchild==NULL)
160             count++;//叶子结点计算
161         leafcount(t->lchild,count);//左子树叶子个数
162         leafcount(t->rchild,count);//右子树叶子个数
163     }
164 }
165 void displaybt(btree t)//以广义表法输出二叉树
166 {
167     if(t!=NULL)
168     {
169         cout<data;
170         if(t->lchild!=NULL||t->rchild!=NULL)
171         {
172             cout<<'(';
173             displaybt(t->lchild);
174             if(t->rchild!=NULL)
175                 cout<<',';
176             displaybt(t->rchild);
177             cout<<')';
178         }
179     }
180 }
181 void createbt1(btree &t,char *str)//由广义表str串创建二叉链
182 {
183     btnode *st[max];
184     btnode *p=NULL;
185     int top=-1,k,j=0;
186     char ch;
187     t=NULL;//建立的二叉树初始化为空
188     ch=str[j];
189     while(ch!='\0')//str未扫描完时循环
190     {
191         switch(ch)
192         {
193             case '(':top++;st[top]=p;k=1;break;//为左结点
194             case ')':top--;break;
195             case ',':k=2;break;//为右结点
196             default:p=new btnode;
197             p->data=ch;
198             p->lchild=p->rchild=NULL;
199             if(t==NULL)//p指向二叉树的根结点
200                 t=p;
201             else//已建立二叉树根结点
202             {
203                 switch(k)
204                 {
205                     case 1:st[top]->lchild=p;break;
206                     case 2:st[top]->rchild=p;break;
207                 }
208             }
209         }
210         j++;
211         ch=str[j];
212     }
213 }

运行结果如下:

树和二叉树的存储结构的实现(C/C++实现)_第1张图片

 

你可能感兴趣的:(树和二叉树的存储结构的实现(C/C++实现))