实验五:二叉树的基本操作

#include
#include


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
#include
#include
#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<data1<<"  ";
  PreOrderTraverse(root->lchild);
  PreOrderTraverse(root->rchild);
 }
 return ;  
}

void InOrderTraverse(rtree &root)//递归中序遍历
{ 
 if(root)
 {
  InOrderTraverse(root->lchild);
  cout<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<data1<<"  ";
   p=p->rchild;
   
  }
 }
 return ;
}

 

 

void EndOrderTraverse(rtree &root)//递归后序遍历
{   
 if(root)
 {
  EndOrderTraverse(root->lchild);
  EndOrderTraverse(root->rchild);
  cout<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陈东东**************"<data1<<"  ";
  if(p->lchild)
  EnQueue(Q,p->lchild);
  if(p->rchild)
  EnQueue(Q,p->rchild);
 }
 cout<


1)输入字符序列,建立二叉链表。

2)先序、中序、后序遍历二叉树:递归算法。

3)中序遍历二叉树:非递归算法。(最好也能实现先序、后序非递归算法)

4)求二叉树的高度 。

5)求二叉树的叶子个数。

6)借助队列实现二叉树的层次遍历。

7)在主函数中设计一个简单的菜单,分别调试上述算法。

 

 。

你可能感兴趣的:(树,tree,struct,算法,null,扩展)