码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树非递归遍历

时间:2015-08-04 17:20:36      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:


//建议不会的  自己在纸上模拟一下  就会明白
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
typedef struct node
{
 char x;
 struct node *lchild;
 struct node *rchild;
}*linklist,tree;
void chu(linklist *head)
{
 (*head)=NULL;
}
void pretree(linklist *head)
{
 char s;
 scanf("%c",&s);
 if(s==‘#‘) (*head)=NULL;
 else
 {
  *head=(linklist)malloc(sizeof(tree));
  (*head)->x=s;//根
  pretree(&((*head)->lchild));//左孩子
  pretree(&((*head)->rchild));//又孩子
    }
}
void predg(linklist head)//先序递归
{
 if(head)
 {
  printf("%c",head->x);
  predg(head->lchild);
  predg(head->rchild);
 }
}
void prefdg(linklist head)//先序非递归
{
 linklist stack[100];
 int top;
 tree *p;
 top=0;
 p=head;
 while(p!=NULL||top>0)
 {
  while(p!=NULL)
  {
   printf("%c ",p->x);//根
   stack[top]=p;
   top++;
   p=p->lchild;//左孩子
  }
  if(top>0)
  {
   top--;
   p=stack[top];
   p=p->rchild;//又孩子
  }
 } 
}
void indg(linklist head)//中序递归
{
 if(head)
 {
  indg(head->lchild);
  printf("%c ",head->x);
  indg(head->rchild);
 }
}
void infdg(linklist head)//中序非递归
{
 linklist stack[100];
 int top=0;
 linklist p;
 p=head;
 while(p!=NULL||top>0)
 {
  while(p!=NULL)
  {
  stack[top++]=p;
  p=p->lchild;
  }
  if(top>0)
  {
   top--;
  p=stack[top];
  printf("%c ",p->x);
  p=p->rchild;
  }
    }
}
void podg(linklist head)//后序递归
{
 if(head)
 {
  podg(head->lchild);
  podg(head->rchild);
  printf("%c ",head->x);
 }
}
void pofdg(linklist head)//后序非递归
{
 linklist stack[100];
 int top=0;
 linklist p=head,q=NULL;
 while(p!=NULL||top>0)
 {
  while(p!=NULL)
  {
    stack[top++]=p;
    p=p->lchild;
  }
  if(top>0)
  {
   p=stack[top-1];
   if(p->rchild==NULL||p->rchild==q)
   {
    printf("%c ",p->x);
    q=p;
    p=NULL;
    top--;
   }
   else p=p->rchild;
  }
 }
}
int main()
{
 linklist head;
 chu(&head);
 printf("请输入先序序列:\n");
 pretree(&head);
 printf("先序递归:\n");
 predg(head);
 printf("\n");
 printf("先序非递归\n");
 prefdg(head);
 printf("\n");
 printf("中序递归\n");
 indg(head);
 printf("\n");
 printf("中序非递归\n");
 infdg(head);
 printf("\n");
 printf("后序递归\n");
 podg(head);
 printf("\n");
 printf("后序非递归\n");
 pofdg(head);
 printf("\n");
 return 0;
}
//测试数据ABD#G##EH##I##CF#J###

版权声明:本文为博主原创文章,未经博主允许不得转载。

二叉树非递归遍历

标签:

原文地址:http://blog.csdn.net/yueloveme/article/details/47278387

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!