二叉树的建立....急用呀啊~~~~~~

yqzhanglei 2003-10-20 02:35:19
还有遍历~~~
...全文
36 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhangYv 2003-12-05
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2059/2059607.xml?temp=.7144586
一个非递归遍历树的C程序,CreateTree()生成高度为N的满二叉树,后使用三种非递归形式的遍历,输出.前/中序非递归遍历是差不多的,后序遍历比较难理解.一个重要的方法是要懂得如何判定已遍历过的结点.
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
struct Node{
int info;
Node *lchild;
Node *rchild;
};
struct Stack{
Node *ds;
Stack *next;
};
Stack *Push(Stack *top, Node *ds)
{
Stack *t = top;
top = (Stack *) malloc (sizeof(Stack));
top->ds = ds;
top->next = t;
return top;
}
Stack *Pop(Stack *top)
{
if (top){
Stack *t = top;
top = top->next;
free(t);
} else
;//Pop error message...
return top;
}
Node *GetTop(Stack *top)
{
if (top)
return top->ds;
else
return NULL;
}
void CreateTree(Node *node, int n, int *N, int *i)
{
node->info = *i; (*i)++;
if (n < *N){
node->lchild = (Node*) malloc (sizeof(Node));
CreateTree(node->lchild, n+1, N, i);
node->rchild = (Node*) malloc (sizeof(Node));
CreateTree(node->rchild, n+1, N, i);
}else{
node->lchild = NULL;
node->rchild = NULL;
}
}

void Preorder(Node *root)
{
Node *p;
Stack *top = NULL;
top = Push(top, root);
printf("%d ", top->ds->info);
p = root->lchild;
while (1){
for (; p; p = p->lchild){
printf("%d ", p->info);
top = Push(top, p);
}
do
if (top){
p = GetTop(top);
p = p->rchild;
top = Pop(top);
} else
return;
while (!p);
}
}

void Inorder(Node *root)
{
Node *p;
Stack *top = NULL;
top = Push(top, root);
p = root->lchild;
while (1){
for (; p; p = p->lchild)
top = Push(top, p);
do
if (top){
p = GetTop(top);
printf("%d ", p->info);
p = p->rchild;
top = Pop(top);
} else
return;
while (!p);
}
}

void Postorder(Node *root)
{
int Continue;
Node *p, *flag;
Stack *top = NULL;
top = Push(top, root);
p = root->lchild;
while (1){
for (; p; p = p->lchild)
top = Push(top, p);
Continue = 1;
flag = NULL;
do
if (top){
p = GetTop(top);
if (p->rchild != flag){
p = p->rchild;
Continue = 0;
} else{
printf("%d ", p->info);
flag = p;
top = Pop(top);
}
} else
return;
while (Continue);
}
}

void main()
{
int N, s = 0;
Node *root = (Node *) malloc (sizeof(Node));
clrscr();
printf("%s", "Please Input Depth = ");
scanf ("%d", &N);
CreateTree(root, 0, &N, &s);
printf("%s\n", "Preorder Sequeuce = ");
Preorder(root);
printf("\n");

printf("%s\n", "Inorder Sequeuce = ");
Inorder(root);
printf("\n");

printf("%s\n", "Postorder Sequeuce = ");
Postorder(root);
printf("\n");
}

一个后序遍历树的非递归算法介绍http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=1377

void PreOrder_Nonrecursive(Bitree T)// 先序遍历二叉树的非递归算法
{
InitStack(S);
Push(S,T); //根指针进栈
while(!StackEmpty(S)){
while(Gettop(S,p)&&p){
visit(p->data);
push(S,p->lchild);
} //向左走到尽头
pop(S,p);
if(!StackEmpty(S)){
pop(S,p);
push(S,p->rchild); //向右一步
}
}//while
}//PreOrder_Nonrecursive
lj1006 2003-12-05
  • 打赏
  • 举报
回复
1. 前序遍历
public:
void PreOrder(void (*visit)(T &data) = print) { PreOrder(root, visit); }
private:
void PreOrder(BTNode<T>* p, void (*visit)(T &data))
{
if (p){ visit(p->data); PreOrder(p->left, visit); PreOrder(p->right, visit); }
}
2. 中序遍历
public:
void InOrder(void (*visit)(T &data) = print) { InOrder(root, visit); }
private:
void InOrder(BTNode<T>* p, void (*visit)(T &data))
{
if (p){ InOrder(p->left, visit); visit(p->data); InOrder(p->right, visit); }
}
3. 后序遍历
public:
void PostOrder(void (*visit)(T &data) = print) { PostOrder(root, visit); }
private:
void PostOrder(BTNode<T>* p, void (*visit)(T &data))
{
if (p){ PostOrder(p->left, visit); PostOrder(p->right, visit); visit(p->data); }
}
4. 层次遍历
void LevelOrder(void (*visit)(T &data) = print)
{
queue< BTNode<T>* > a; BTNode<T>* p = root;//记得#include<queue>
while (p)
{
visit(p->data);
if (p->left) a.push(p->left); if (p->right) a.push(p->right);
if (a.empty()) break; p = a.front(); a.pop();
}
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧