| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 322 人关注过本帖
标题:一个关于二叉树先序非递归创建的代码。。
只看楼主 加入收藏
lhzdzh
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-2-28
收藏
 问题点数:0 回复次数:0 
一个关于二叉树先序非递归创建的代码。。
哎 各位高手求教了 求代码。。


先序非递归创建一颗二叉树,,是用C语言写的,,

输入时:AB#D##CE###




这是我弄了一天弄出来的 不知道对不对 各位大哥看看吧
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 5

typedef struct BTNode{
char data;
struct BTNode *lchild,*rchild;
}BTNode,*BTree; //二叉树结构体

typedef struct Tsqstack{
BTree *base;
BTree *top;
int stacksize;
}Tsqstack;//创建时所用到的栈

int Tinitstack(Tsqstack &s) //初始化 栈
{
s.base=(BTree *)malloc(STACK_INIT_SIZE*sizeof(BTNode));
if(!s.base)
  return 0;
else
{
  s.top=s.base;
  s.stacksize=STACK_INIT_SIZE;
}
return 1;
}

int Tpush (Tsqstack &s,BTree &e) //入栈
{
if((s.top-s.base)>=s.stacksize)
{
  s.base =(BTree *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(BTNode));
  if(!s.base) printf("error0");  
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
}  
  *s.top++=e;
   
return 1;
}

int Tpop (Tsqstack &s,BTree &e) //出栈
{

if(s.top==s.base)
  return 0;
e=*--s.top;
return 1;

}

BTree Tgettop(Tsqstack &s) //读栈
{
BTree ch;
if(s.top==s.base)
  printf("error3");
ch=*(s.top-1);
return ch;
}


BTree CreateTree() //建树
{

char ch[99];

BTNode *head,*p,*t;
Tsqstack s;
int i=0,flag=0,m,j; // flag = 0,创建当前结点的左孩子结点,如果flag = 1,创建当前结点的右孩子结点

printf("字符串长度为");
scanf("%d",&j);
printf("请输入字符");
for(m=0;m<j;m++)
scanf("%c",&ch[m]);
  Tinitstack(s);
if(ch=='#') printf("error");
p=(BTNode *)malloc(sizeof(BTNode));
if(p==NULL) printf("error");
p->data=ch; p->lchild=NULL; p->rchild=NULL;
Tpush(s,p);
i++;
head=p;

while(i<j)
{
  if(ch=='#'&&flag==1) //当前要创建的结点值为′#′并且flag = 1,说明当前结点的父结点左右孩子结点处理结束,应将栈顶结点出栈。如果出栈的结点依然等于栈顶结点的右孩子,说明当前栈顶结点的左右孩子结点也处理
结束,栈顶结点继续出栈。直到当前栈顶结点的右孩子结点不等于出栈的结点为止
  {
  Tpop(s,t);
  while((Tgettop(s))->rchild==t)
  {
  Tpop(s,t);
  }
  }
  else if (ch=='#'&&flag==0) //当前要创建的结点值为′#′并且flag =0,则置flag =1,当前结点的左孩子创建结束,转向创建右孩子
  flag=1;
  else
  {
  p=(BTNode *)malloc(sizeof(BTNode));
  if(p==NULL) return NULL;
  p->data=ch; p->lchild=NULL; p->rchild=NULL;
  if(flag==0) //当前要创建的结点值不为′#′并且flag = 0,创建当前结点并作为栈顶结点的左孩子,同时将当前结点入栈
  {
  (Tgettop(s))->lchild=p;
  Tpush(s,p);
  }
  else //当前要创建的结点值不为′#′并且flag = 1,创建当前结点并作为栈顶结点的右孩子,同时将当前结点入栈,然后置flag = 0,转向左孩子结点的创建
  {
  (Tgettop(s))->rchild=p;
  flag=0;
  Tpush(s,p);
  }
  }
  i++;
}
return head;
}


void main()
{
BTree T;
T=CreateTree();

}

搜索更多相关主题的帖子: 二叉树 结构体 C语言 
2011-04-22 22:43
快速回复:一个关于二叉树先序非递归创建的代码。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.070468 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved