| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1197 人关注过本帖
标题:[求助]二叉树的非递归问题
只看楼主 加入收藏
discus815
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2007-10-11
收藏
 问题点数:0 回复次数:3 
[求助]二叉树的非递归问题

下面的程序,哪个高手看看啊,帮我改一下错(二叉树的非递归问题):
//BiTree.h
#ifndef BITREE_H
#define BITREE_H

template<class T>
struct BiNode
{
T data;
BiNode<T> *lchild,*rchild;
};

template<class T>
class BiTree
{
public:
BiTree(); //有参构造函数,初始化一棵二叉树,其前序序列由键盘输入
~BiTree(); //析构函数,释放二叉树链表中各结点的存储空间
BiNode<T> *Getroot(); //获得指向根结点的指针
void PreOrder(BiNode<T> *root); //前序遍历二叉树
void InOrder(BiNode<T> *root); //中序遍历二叉树
void PostOrder(BiNode<T> *root); //后序遍历二叉树
private:
BiNode<T> *root; //指向根结点的指针
BiNode<T> *Creat(); //有参构造函数调用
void Release(BiNode<T> *root); //析构函数调用
};

#endif

//BiTree.cpp
#include<iostream>
#include<string>
#include"BiTree.h"
using namespace std;

template<class T>
BiTree<T>::BiTree()
{
root=Creat();
}

template<class T>
BiTree<T>::~BiTree(void)
{
Release(root);
}

template<class T>
BiNode<T> *BiTree<T>::Getroot()
{
return root;
}

template<class T>
void BiTree<T>::PreOrder(BiNode<T> *root)
{
int top=-1; //采用顺序栈,并假定不会发生上溢
T s[];
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{
cout<<root->data;
s[++top]=root;
root=root->lchild;
}
if(top!=-1){
root=s[top--];
root=root->rchild;
}
}
}

template<class T>
void BiTree<T>::InOrder(BiNode<T> *root)
{
int top=-1; //采用顺序栈,并假定不会发生上溢
T s[];
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{

s[++top]=root;
root=root->lchild;
}
if(top!=-1){
root=s[top--];
cout<<root->data;
root=root->rchild;
}
}
}

template<class T>
void BiTree<T>::PostOrder(BiNode<T> * root)
{
int top=-1;
T s[];
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{
top++;
s[top].ptr=root;
s[top].flag=1;
root=root->lchild;
}
while(top!=-1&&s[top].flag==2)
{
root=s[top--].ptr;
cout<<root->data;
}
if(top!=-1){
s[top].flag=2;
root=s[top].ptr->rchild;
}
}
}

template <class T>
BiNode<T>* BiTree<T>::Creat( )
{
BiNode<T>* root;
T ch;
cout<<"请输入创建一棵二叉树的结点数据"<<endl;
cin>>ch;
if (ch=="#") root = NULL;
else{
root = new BiNode<T>; //生成一个结点
root->data=ch;
root->lchild = Creat( ); //递归建立左子树
root->rchild = Creat( ); //递归建立右子树
}
return root;
}


template<class T>
void BiTree<T>::Release(BiNode<T>* root)
{
if (root != NULL){
Release(root->lchild); //释放左子树
Release(root->rchild); //释放右子树
delete root;
}
}
//BiTreeMain.cpp
#include<iostream>
#include<string>
#include"BiTree.cpp"
using namespace std;

int main()
{
BiTree<string> bt; //创建一棵树
BiNode<string>* root=bt.Getroot(); //获取指向根结点的指针

cout<<"----前序遍历-----"<<endl;
bt.PreOrder(root);
cout<<endl;
cout<<"-----中序遍历-----"<<endl;
bt.InOrder(root);
cout<<endl;
cout<<"----后序遍历-----"<<endl;
bt.PostOrder(root);
cout<<endl;
return 0;
}

搜索更多相关主题的帖子: 二叉树 非递归 BiTree BiNode class 
2007-11-02 13:23
zxc1998
Rank: 1
等 级:新手上路
威 望:1
帖 子:133
专家分:0
注 册:2007-3-21
收藏
得分:0 

我只修改了先 中,后序要对s作改动你自己做一下。
我把程序放在了一个文件内,你自己再分开吧。
//BiTree.h
#ifndef BITREE_H
#define BITREE_H

template<class T>
struct BiNode
{
T data;
BiNode<T> *lchild,*rchild;
};

template<class T>
class BiTree
{
public:
BiTree(); //有参构造函数,初始化一棵二叉树,其前序序列由键盘输入
~BiTree(); //析构函数,释放二叉树链表中各结点的存储空间
BiNode<T> *Getroot(); //获得指向根结点的指针
void PreOrder(BiNode<T> *root); //前序遍历二叉树
void InOrder(BiNode<T> *root); //中序遍历二叉树
void PostOrder(BiNode<T> *root); //后序遍历二叉树
private:
BiNode<T> *root; //指向根结点的指针
BiNode<T> *Creat(); //有参构造函数调用
void Release(BiNode<T> *root); //析构函数调用
};

#endif

//BiTree.cpp
#include<iostream.h>
#include<string.h>
//#include"BiTree.h"
//using namespace std;

template<class T>
BiTree<T>::BiTree()
{
root=Creat();
}

template<class T>
BiTree<T>::~BiTree(void)
{
Release(root);
}

template<class T>
BiNode<T> *BiTree<T>::Getroot()
{
return root;
}

template<class T>
void BiTree<T>::PreOrder(BiNode<T> *root)
{
int top=-1; //采用顺序栈,并假定不会发生上溢
BiNode<T> *s[100];
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{
cout<<root->data;
s[++top]=root;
root=root->lchild;
}
if(top!=-1){
root=s[top--];
root=root->rchild;
}
}
}

template<class T>
void BiTree<T>::InOrder(BiNode<T> *root)
{
int top=-1; //采用顺序栈,并假定不会发生上溢
BiNode<T> *s[100];
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{

s[++top]=root;
root=root->lchild;
}
if(top!=-1){
root=s[top--];
cout<<root->data;
root=root->rchild;
}
}
}

template<class T>
void BiTree<T>::PostOrder(BiNode<T> * root)
{
/*int top=-1;
T s[100];
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{
top++;
s[top].ptr=root;
s[top].flag=1;
root=root->lchild;
}
while(top!=-1&&s[top].flag==2)
{
root=s[top--].ptr;
cout<<root->data;
}
if(top!=-1){
s[top].flag=2;
root=s[top].ptr->rchild;
}
} */
}

template <class T>
BiNode<T>* BiTree<T>::Creat( )
{
BiNode<T>* root;
T ch;
cout<<"请输入创建一棵二叉树的结点数据"<<endl;
cin>>ch;
if (ch=='#') root = NULL;
else{
root = new BiNode<T>; //生成一个结点
root->data=ch;
root->lchild = Creat( ); //递归建立左子树
root->rchild = Creat( ); //递归建立右子树
}
return root;
}


template<class T>
void BiTree<T>::Release(BiNode<T>* root)
{
if (root != NULL){
Release(root->lchild); //释放左子树
Release(root->rchild); //释放右子树
delete root;
}
}
//BiTreeMain.cpp
//#include<iostream>
//#include<string>
//#include"BiTree.cpp"
//using namespace std;

int main()
{
BiTree<char> bt; //创建一棵树
BiNode<char>* root=bt.Getroot(); //获取指向根结点的指针

cout<<"----前序遍历-----"<<endl;
bt.PreOrder(root);
cout<<endl;
cout<<"-----中序遍历-----"<<endl;
bt.InOrder(root);
cout<<endl;
cout<<"----后序遍历-----"<<endl;
bt.PostOrder(root);
cout<<endl;
return 0;
}

2007-11-03 08:23
discus815
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2007-10-11
收藏
得分:0 

谢谢楼上的


旋转的木马,没有翅膀,但是却可以带着你飞翔.......
2007-11-03 18:03
快速回复:[求助]二叉树的非递归问题
数据加载中...
 
   



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

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