#include<stdio.h>
#include<stdlib.h>
typedef struct tree{
char data1;
struct tree *lchild,*rchild;
}tree,*rtree;
typedef struct stacklist{
rtree data;
struct stacklist *next;
}stacklist,*linkstack;
linkstack top;
rtree ch1;
linkstack create()
{
linkstack p;
p=(linkstack)malloc(sizeof(stacklist));
p->next=NULL;
return p;
}
void bulidstack(rtree ch1)//进栈
{
linkstack p,q;
//int data;
p=top;
// printf("请输入进栈的元素:");
//scanf("%d",&data);
q=create();
q->data=ch1;
q->next=p->next;
top->next=q;
}
linkstack outstack()//出栈
{
linkstack p,q=NULL;
p=top->next;
if(p!=NULL)
{
//printf("%d 出栈\n",p->data);
top->next=p->next;
q=p;
//free(p);
return q;
}
// else
// printf("栈为空\n");
return q;
}
int StackEmpty()
{
linkstack p;
p=top->next;
if(p!=NULL)
return 0;
return 1;
}
/*void tip()
{
printf("**********\n");
printf("*1 进栈 *\n");
printf("*2 出栈 *\n");
printf("*请选择:*\n");
printf("**********\n");
}*/
/*int main()
{
top=create();
int k;
tip();
while(scanf("%d",&k),k)
{
switch(k)
{
case 1:
bulidstack();
printf("操作完成\n");
tip();
break;
case 2:
outstack();
printf("操作完成\n");
tip();
break;
}
}
return 0;
}*/
// 按扩展的先序序列(即包括空结点,#表示空结点)输入二叉树的各结点,建立二叉树
#include"stack.h"
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define OVERFLOW -2
using namespace std;
/*typedef struct tree{
char data1;
struct tree *lchild,*rchild;
}tree,*rtree;*/
int highmax,leaf;
char ch;
void CreateBiTree(rtree &root)//1
{
//二叉树中的节点值(一个字符),#字符表示空树;
//构造二叉链表的二叉树root
//printf("请按照先序次序输入二叉链表的二叉树root:");
cin>>ch;
if(ch=='#') root=NULL;
else
{
if(!(root=(rtree)malloc(sizeof(tree))))//分配失败
exit(OVERFLOW);
root->data1=ch;//生成根节点
CreateBiTree(root->lchild);
CreateBiTree(root->rchild);
}
return ;
}
void PreOrderTraverse(rtree &root)//递归先序遍历
{
if(root)
{
cout<<root->data1<<" ";
PreOrderTraverse(root->lchild);
PreOrderTraverse(root->rchild);
}
return ;
}
void InOrderTraverse(rtree &root)//递归中序遍历
{
if(root)
{
InOrderTraverse(root->lchild);
cout<<root->data1<<" ";
InOrderTraverse(root->rchild);
}
return ;
}
void InOrderTraverse1(rtree &root)//非递归中序遍历
{
top=create();
linkstack s;
rtree p;
p=root;
while(p||!StackEmpty())
{
if(p)
{
bulidstack(p);
p=p->lchild;
}
else
{
s=outstack();
p=s->data;
if(p)
cout<<p->data1<<" ";
p=p->rchild;
}
}
return ;
}
void EndOrderTraverse(rtree &root)//递归后序遍历
{
if(root)
{
EndOrderTraverse(root->lchild);
EndOrderTraverse(root->rchild);
cout<<root->data1<<" ";
}
return ;
}
void TreeHigh(rtree &root,int high)//二叉树的高度
{
if(root)
{
high++;
if(high>highmax)
highmax=high;
TreeHigh(root->lchild,high);
TreeHigh(root->rchild,high);
}
return;
}
void TreeLeaf(rtree &root,int l)//求二叉树的叶子个数。
{
if(root)
{
if(root->lchild==NULL&&root->rchild==NULL)
leaf++;
TreeLeaf(root->lchild,l);
TreeLeaf(root->rchild,l);
}
return ;
}
void tip()
{
cout<<"************计科1001陈东东**************"<<endl;
cout<<"*1 输入字符序列,建立二叉链表 *"<<endl;
cout<<"*2 先序、中序、后序遍历二叉树:递归算法 *"<<endl;
cout<<"*3 中序遍历二叉树:非递归算法 *"<<endl;
cout<<"*4 求二叉树的高度 *"<<endl;
cout<<"*5 求二叉树的叶子个数 *"<<endl;
cout<<"*6 借助队列实现二叉树的层次遍历 *"<<endl;
cout<<"*0 退出 *"<<endl;
cout<<"****************************************"<<endl;
}
队列
#define MAXQSIZE 100 /*队列的最大长度*/
typedef struct queue{
rtree *base; // 队列的元素空间头指针指示器
int front;
int rear; /*尾指针指示器*/
}SqQueue;
rtree data2;
int InitQueue(SqQueue &Q) {//初始化操作
Q.base = (rtree * )malloc(MAXQSIZE*sizeof(rtree));
if (!Q. base) exit (OVERFLOW);
Q.front=Q.rear =0;
return 1;
}
int EnQueue(SqQueue &Q,rtree e) {//入队操作
if ((Q. rear+ 1) % MAXQSIZE == Q. front)
{
printf("队列已满,不能进队\n");
return -1;//满标志
}
// printf("请输入进队元素:");
//scanf("%d",&e);
Q.base[Q.rear] = e;//进队
Q.rear = (Q. rear + 1) % MAXQSIZE;//队尾指针后移
return 1;
}
rtree DeQueue (SqQueue &Q) {//出队操作
rtree e;
if (Q. front == Q. rear) {
printf("队列已经为空\n");
return 0;
}
e = Q. base[Q. front];//队头出队
// printf("%d 出队\n",e);
Q.front = (Q.front + 1) % MAXQSIZE;//队头下标后移
return e;
}
int QueueEmpty(SqQueue &Q)//判断是否为空
{
if (Q. front == Q. rear)
return 1;
return 0;
}
void Traverse(rtree &root)
{
SqQueue Q;
InitQueue(Q);//初始化
rtree p;
EnQueue(Q,root);
while(!QueueEmpty(Q))
{
p=DeQueue(Q);
cout<<p->data1<<" ";
if(p->lchild)
EnQueue(Q,p->lchild);
if(p->rchild)
EnQueue(Q,p->rchild);
}
cout<<endl;
return ;
}
int main()
{
tip();
int k;
rtree root;//声明根
while(scanf("%d",&k),k)
{
switch(k)
{
case 1:
cout<<"按扩展的先序序列,#表示空结点,请输入字符:"<<endl;
CreateBiTree(root);
cout<<"操作完毕"<<endl;
tip();
break;
case 2:
cout<<"先序递归遍历:";
PreOrderTraverse(root);
cout<<endl;
cout<<"中序递归遍历:";
InOrderTraverse(root);
cout<<endl;
cout<<"后序递归遍历:";
EndOrderTraverse(root);
cout<<endl;
cout<<"操作完毕"<<endl;
tip();
break;
case 3:
cout<<"中序非递归遍历:";
InOrderTraverse1(root);
cout<<endl;
cout<<"操作完毕"<<endl;
tip();
break;
case 4:
highmax=0;
TreeHigh(root,0);
cout<<"二叉树的高度为:"<<highmax<<endl;
cout<<"操作完毕"<<endl;
tip();
break;
case 5:
leaf=0;
TreeLeaf(root,0);
cout<<"二叉树的叶子结点个数为:"<<leaf<<endl;
cout<<"操作完毕"<<endl;
tip();
break;
case 6:
Traverse(root);
cout<<"操作完毕"<<endl;
tip();
break;
}
}
//CreateBiTree(root);
/*PreOrderTraverse(root);
cout<<endl;
InOrderTraverse(root);
cout<<endl;
EndOrderTraverse(root);
cout<<endl;
highmax=0;
TreeHigh(root,0);
cout<<"二叉树的高度为:"<<highmax<<endl;
leaf=0;
TreeLeaf(root,0);
cout<<"二叉树的叶子结点个数为:"<<leaf<<endl;
InOrderTraverse1(root);
cout<<endl;*/
return 0;
}
//ABD###CE##F##
(1)输入字符序列,建立二叉链表。
(2)先序、中序、后序遍历二叉树:递归算法。
(3)中序遍历二叉树:非递归算法。(最好也能实现先序、后序非递归算法)
(4)求二叉树的高度 。
(5)求二叉树的叶子个数。
(6)借助队列实现二叉树的层次遍历。
(7)在主函数中设计一个简单的菜单,分别调试上述算法。
。