数据结构与算法 ~ 树和二叉树 ~ 使用链表存储(递归前中后序遍历)

 数据结构与算法 ~ 树和二叉树 ~ 使用链表存储,采用递归实现前中后序遍历

#include<stdlib.h>
#include<stdio.h>
/*头结点*/
struct headnode{
	int data;  /*数据域存放二叉树的结点数*/
	struct treenode *next;/*指向二叉树的根结点*/
};
typedef struct headnode *Headnode;

struct treenode{
	int data;
	struct treenode *left; /*左孩子指针*/
	struct treenode *right;/*右孩子指针*/
};
typedef struct treenode *Bitree;
int length;

void Create_Bitree(Headnode head){ 
	int e;
	Bitree newnode,pointer,perpointer;
	printf("\n=======创建二叉树============\n");
	while(1){
		printf("\n请输入数据(退出0):");
		scanf("%d",&e);
		if (e==0) break;
		newnode=(Bitree)malloc(sizeof(struct treenode));/*分配结点*/
		newnode->data=e;/*初始化结点*/
		newnode->left=NULL;
		newnode->right=NULL;
		if (head->data==0)  { head->next=newnode; }  /*树空,接为根结点*/
		else {
			pointer=head->next;
			perpointer=pointer;
			while (pointer!=NULL){
				/*搜索插入位置*/
				if  ( (newnode->data)<(pointer->data) ){
					perpointer=pointer;
                    pointer=pointer->left;
				}else{
					perpointer=pointer;
                    pointer=pointer->right;
				}
			}/*while*/
           if (newnode->data<perpointer->data) /*插入*/
                 perpointer->left=newnode;
           else perpointer->right=newnode;
          }/*if*/
   head->data++;
 }/*while*/
 printf("\n二叉树的长度是%d",head->data);
 length=head->data;
 printf("\n=====二叉树创建结束=======\n");
}/*create bitree*/

void PreorderTraverse(Bitree prenode){
  if (prenode!=NULL){
    printf("%4d",prenode->data);
    PreorderTraverse(prenode->left);
    PreorderTraverse(prenode->right);
  }/*if*/
}/*PreorderTraverse*/

void InorderTraverse(Bitree prenode){
  if (prenode!=NULL){
    InorderTraverse(prenode->left);
    printf("%4d",prenode->data);
    InorderTraverse(prenode->right);
  }/*if*/
}/*InorderTraverse*/

void PostorderTraverse(Bitree prenode){
   if (prenode!=NULL){
    PostorderTraverse(prenode->left);
    PostorderTraverse(prenode->right);
    printf("%4d",prenode->data);
   }/*if*/
}/*PostorderTraverse*/


int formatList(){
  int e;
  printf("\n=====================================");
  printf("\n1---先序遍历输出");
  printf("\n2---中序遍历输出");
  printf("\n3---后序遍历输出");
  printf("\n0---退出");
  printf("\n=====================================");
  printf("\n请选择:") ;
  scanf("%d",&e);
  return e;
}

void Print(Headnode head){
  int e;
  e=formatList();
  while (e!=0){
    switch(e){
     case 1: PrePrint(head);break;
     case 2: InPrint(head); break;
     case 3: PostPrint(head);break;
     default : printf ("输入错误!请重新选择");
    }/*switch*/
   e=formatList();
  }/*while*/
}/*Print*/

int PrePrint(Headnode head){
 Bitree prenode;
 prenode=head->next;
 printf("\n====树的先序遍历开始===\n");
 PreorderTraverse(prenode);
 printf("\n树的长度是 %d",head->data);
 printf("\n====树的先序遍历输出结束===\n");
 return 0;
}

int InPrint(Headnode head){
 Bitree prenode;
 prenode=head->next;
 printf("\n====树的中序遍历开始===\n");
 InorderTraverse(prenode);
 printf("\n树的长度是%d",head->data);
 printf("\n====树的中序遍历结束===\n");
 return 0;
}

int PostPrint(Headnode head){
 Bitree prenode;
 prenode=head->next;
 printf("\n====树的后序遍历开始===\n");
 PostorderTraverse(prenode);
 printf("\n树的长度是%d",head->data);
 printf("\n====树的后序遍历结束===\n");
 return 0;
}

int main(){
 Headnode head;
 head=(Headnode)malloc(sizeof(struct headnode));
 head->data=0;
 head->next=NULL;
 Create_Bitree(head);
 Print(head);
 system("pause");
 return 0;
}

输入数据如:34,76,45,18,26,54,92


=======创建二叉树============

请输入数据(退出0):34

请输入数据(退出0):76

请输入数据(退出0):45

请输入数据(退出0):18

请输入数据(退出0):26

请输入数据(退出0):54

请输入数据(退出0):92

请输入数据(退出0):0

二叉树的长度是7
=====二叉树创建结束=======

=====================================
1---先序遍历输出
2---中序遍历输出
3---后序遍历输出
0---退出
=====================================
请选择:1

====树的先序遍历开始===
  34  18  26  76  45  54  92
树的长度是 7
====树的先序遍历输出结束===

=====================================
1---先序遍历输出
2---中序遍历输出
3---后序遍历输出
0---退出
=====================================
请选择:2

====树的中序遍历开始===
  18  26  34  45  54  76  92
树的长度是7
====树的中序遍历结束===

=====================================
1---先序遍历输出
2---中序遍历输出
3---后序遍历输出
0---退出
=====================================
请选择:3

====树的后序遍历开始===
  26  18  54  45  92  76  34
树的长度是7
====树的后序遍历结束===

=====================================
1---先序遍历输出
2---中序遍历输出
3---后序遍历输出
0---退出
=====================================
请选择:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值