建立二叉树,实现前序遍历的非递归算法及递归算法<有追加>

来源:百度知道 编辑:UC知道 时间:2024/06/03 02:05:39
我的程序是这样的可以没有结果出来,编译链接都没错,请高手帮忙看看,追加30分。谢谢了
//二叉树处理头文件

#include<iostream>
using namespace std;

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

void CreateBiTree(BiTree &BT)//二叉树创建函数
{
char ch;
ch=getchar();
if(ch=='#')
BT=NULL;
else
{
BT=(BiTree)malloc(sizeof(BiTNode));
BT->data=ch;
CreateBiTree(BT->lchild);
CreateBiTree(BT->rchild);
}
}

//前序递归遍历
void PreOrder(BiTNode *BT)
{
if(BT!=NULL)
{
cout<<BT->data<<' ';
PreOrder(BT->lchild);
PreOrder(BT->rchild);
}
}

//前序非递归遍历
void PreOrder1(BiTNode *BT)
{
BiTNode *p;
BiTNode* stack[20];
int top=0;
p=BT;

while(p||top!=0)
{
while(BT)
{
cout<<p->data;

找本数据结构书,自己看去。
/////////////////////////////////
地球人都知道遍历二叉树不用递归就只能用栈了
另:
hope1262你说的那个是堆,数组存储二叉树,他的这个明显不是
////////////////////////////////
递归在编译器实现的时候也是用堆栈实现的。递归的时候是从上向下的,而由于堆栈是先进后出,所以压栈的时候要先压后面的结点。
一棵树分为左子树、根和右子树,所以先把右子树压入栈,输出根,然后再压入左子树,压左子树时又重复这一过程了,直左子树为空;这时开始从栈中把之前压入的右子树pop出来,再重复上面的过程,直到栈为空。
代码:
void PreOrder(BiTNode *BT)
{
push(BT);
while(!IsEmpty)
{
pop(BT);
while(BT)
{
VISIT(BT);
push(BT->rchild);
BT=BT->lchild;
}
}
}
你的代码自己改吧,记得先把根压进栈。

建立二叉树, 非递归只能用数组.
就是 i是当前根结点 2*i是该节点的左节点 2*i+1是该节点右节点
好像不用递归