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

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

/*tree-Traverse no recursion*/
#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 InorderTraverse(Headnode head){
  int i,e;
  int *stack[10];  
  /*设置一个指针数组,用于存放遍历时的结点地址*/
  int top=0,base=0;
  Bitree pointer;
  printf("\n==非递归的中序遍历: ");
  for(i=0;i<10;++i)   
	  stack[i]=0;/*初始化栈*/
  pointer=head->next;
  while(pointer!=NULL||base!=top){
   if (pointer!=NULL){
       stack[top++]=pointer;  /*根结点地址进栈*/
       pointer=pointer->left; /*访问左子树*/
      }/*if*/
   else{                      /*从左子树返回*/
        pointer=stack[--top];  /*取出根结点地址*/
        printf("%d     ",pointer->data);/*输出信息*/
        pointer=stack[top];
	pointer=pointer->right; /*进入右子树*/
       }/*else*/
  }/*while*/
 printf("输出结束\n");
}/*InorderTraverse*/

/*利用链表结构前序遍历二叉树*/
void PreorderTraverse(Headnode head){
 int i,e;
  int *stack[10];
  /*设置一个指针数组,用于存放遍历时的结点地址*/
  int top=0,base=0;
  Bitree pointer;
  printf("\n==非递归的前序遍历: ");
  for(i=0;i<10;++i)   stack[i]=0;/*初始化栈*/
  pointer=head->next;
  stack[top++]=NULL;
  while(pointer!=NULL){
   printf("%d     ",pointer->data);
   if (pointer->right!=NULL)/*右子树非空*/
      stack[top++]=pointer->right;/*右子树根结点进栈*/
   if (pointer->left!=NULL)       /*左子树非空*/
      pointer=pointer->left;      /*进入左子树准备访问*/
   else pointer=stack[--top];     /*否则从栈中取出最近的右子树地址准备访问*/
  }/*while*/
 printf("输出结束\n");
}/*PreorderTraverse*/

int main(){
 Headnode head;
 head=(Headnode)malloc(sizeof(struct headnode));
 head->data=0;
 head->next=NULL;
 Create_Bitree(head);
 InorderTraverse(head);
 PreorderTraverse(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
=====二叉树创建结束=======

==非递归的中序遍历: 18     26     34     45     54     76     92     输出结束

==非递归的前序遍历: 34     18     26     76     45     54     92     输出结束
请按任意键继续. . .

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值