二叉树及其应用

实验内容:假设自上而下按层次,自左至右输入每个结点的一个三元组(N, P, L/R)。其中N为本结点的元素,P为其父结点,L指示N为P 的左孩子,R指示N为P的右孩子。试写一个建立二元树在内存的双链表示算法,并实现先根、中根、后根以及层序遍历算法。


样例输出(二选一):

a -1-1
b a L
g a R
c b L
d b R
h g L
e d L
f d R
-1


1 -1-1
2 1 L
3 1 R
4 2 L
5 2 R
6 3 L
7 3 R
8 4 L
9 4 R
10 6 R
11 7 L
-1



代码样例:

#include<stdio.h>
#include <stdlib.h>
#include<string>
#include<iostream>
using namespace std;
#define MAXSIZE 50
struct BinaryTree
{
int c;
struct BinaryTree * l, * r;
};


struct BinaryTree * Create_BiTree()/*二叉树的建立*/
{
   int i,FA;
   string LR;
   struct BinaryTree *s,*t,*p[MAXSIZE];
   printf("输入顶点信息及编号:\n");
   
   while(1)
    {
cin>>i;
if(i == -1)
break;
cin>>FA>>LR;

 s=(struct BinaryTree *)malloc(sizeof(struct BinaryTree));
 s->c=i;
          s->l = s->r = NULL;
          p[i] = s;
          if(FA == -1) 
t=s;
          if( LR == "L")
p[FA]->l=s;
 else if(LR =="R") 
 {
p[FA]->r=s;
 }


   }
   return t;
}
void  PreOrder(struct BinaryTree *bt)
{
    if(bt)
    {
       cout<<bt->c;
        PreOrder(bt->l);
        PreOrder(bt->r);
    }
}
void  InOrder(struct BinaryTree *bt)
{
    if(bt)
    {
       InOrder(bt->l);
       cout<<bt->c;
       InOrder(bt->r);
    }
}
void  PostOrder(struct BinaryTree *bt)
  {
     if(bt)
     {
       PostOrder(bt->l);
       PostOrder(bt->r);
       cout<<bt->c;
     }
   }
void LevelOrder(struct BinaryTree *bt) 

struct BinaryTree* q[MAXSIZE];
    int front,rear;
    if(bt==NULL) 
  return;
    front=0;      /*非循环队列*/
    rear=0;
    q[rear++]=bt;
    while(front!=rear)
{
 cout<<q[front]->c; 
 if(q[front]->l!=NULL)  
 {  
 q[rear]=q[front]->l;
 rear++;
 }
if (q[front]->r!=NULL)  
{  
q[rear]=q[front]->r; 
rear++; 
}
front++;
}
}
int main()
{


int j;
struct BinaryTree *t;
t=Create_BiTree();
while(1)
{
printf("\n"); 
printf("请选择操作:\n");
printf("1:  二叉树的前序遍历\n");
printf("2:  二叉树的中序遍历\n");
printf("3: 二叉树的后序遍历\n");
printf("4: 二叉树的层次遍历\n");
scanf("%d",&j);
switch(j)
  {
   case 1: 
printf("前序遍历结果:\n"); 
PreOrder(t); 
break;
   case 2: 
printf("中序遍历结果:\n"); 
InOrder(t);
break;
case 3: 
printf("后序遍历结果:\n"); 
PostOrder(t);
break;
case 4: 
printf("按层遍历结果:\n");
LevelOrder(t);
break;
}
 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值