请教一个关于建二叉树的问题?(分数不够再加)

anticipate 2002-06-25 05:40:48
//Tree_Node.h

#include<iostream>
using namespace std;
struct Tree_Node
{
char data;
Tree_Node *Lchild,*Rchild;
Tree_Node(char ch=' ');
~Tree_Node(){};
friend void crtree(Tree_Node *T, char a[],char b[], int n);
};

Tree_Node::Tree_Node(char ch)
{
data=ch;
Lchild=NULL;
Rchild=NULL;
}

//Bit_Tree.h
#include<iostream>
#include"Tree_Node.h"

class Bit_Tree
{
Tree_Node *bt_Node;
public:
Bit_Tree(){};
~Bit_Tree(){};
void cre();
void ShowTreeFirst();
void ShowTreeMiddle();
friend void crtree( Tree_Node *T,char a[],char b[],int m);
};

//BitTree.cpp
#include"Bit_Tree.h"
void crtree(Tree_Node *T, char a[],char b[], int n);
void Bit_Tree::cre()//Bit_Tree()
{
cout<<"请输入结点个数:";
int n;
cin>>n;
cout<<endl;
char *a=new char[n];
char *b=new char[n];
cout<<"请输入先序序列:"<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
cout<<endl;
cout<<"请输入中序序列:"<<endl;
for(int j=0;j<n;j++)
cin>>b[j];
cout<<endl;
Tree_Node * newnode=new Tree_Node;
newnode->data=a[0];
bt_Node=newnode;
crtree(bt_Node=new Tree_Node,a,b,n);
}
void crtree(Tree_Node * T, char a[],char b[], int n)
{
int m=0;
while((b[m]!=a[0])&&(m<n))
m++;
char *c=new char[m];
char *d=new char[m];
int s=n-m;
char *e=new char[s];
char *f=new char[s];
for(int i=0;i<m;i++){c[i]=a[i];d[i]=b[i];};
for(int j=0;j<n-m;j++){e[j]=a[j+m];f[j]=b[j+m];};
Tree_Node *node1=new Tree_Node;
node1->data=c[0];
T->Lchild=node1;
if(i!=0)
crtree(T->Lchild,c,d,i);
cout<<'c'; //这句是用来检测的,但程序运行时根本没有
‘c'显示出来。
Tree_Node *node2=new Tree_Node;
node2->data=e[0];
T->Rchild=node2;
if(j!=0)
crtree(T->Rchild,e,f,j);
}
void FirstViste(Tree_Node * bt)
{
if(bt!=NULL)
{
FirstViste(bt->Lchild);
cout<<bt->data;
FirstViste(bt->Rchild);
}
}


void main()
{
Bit_Tree binarytree;
binarytree.cre();
cout<<"该二叉树的中序序列为:"; //这一句也没有显示
FirstViste(binarytree.bt_Node);
}
...全文
35 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
anticipate 2002-06-27
  • 打赏
  • 举报
回复
继续努力,谢谢!
潘李亮 2002-06-26
  • 打赏
  • 举报
回复
TO楼主,回头我把程序给你调式出来,你可要给我分哦
潘李亮 2002-06-26
  • 打赏
  • 举报
回复
树的程序我有很多,要的话,给我发个邮件吧
xheartblue@etang.com
说清楚是要什么东西的
潘李亮 2002-06-26
  • 打赏
  • 举报
回复
火了,我改了一个中午的程序,怎么还不给我分!!!!
d_selenite 2002-06-26
  • 打赏
  • 举报
回复
太长,挑重要的贴!
潘李亮 2002-06-26
  • 打赏
  • 举报
回复
我只管改程序,楼主记得给分哦
alula 2002-06-26
  • 打赏
  • 举报
回复
给你另一个类似的例子参考吧。
本是 <essential c++>的例子,在<thinking in c++>影响下,做了许多修改。
//: BinaryTree.h

#include <iostream>

template<typename elemType>
class BinaryTree {
struct Node {
elemType value;
int cnt;
Node* lchild;
Node* rchild;

Node(const elemType& elem) : value(elem) {
cnt = 1;
lchild = rchild = 0;
}
}* root;

void insert_value( const elemType& elem, Node* node );
void remove_value( const elemType& elem, Node*& node );
void clear( Node* node );
static void lchild_leaf( Node* leaf, Node* subtree );
void preorder( Node* node );
public:
BinaryTree();
~BinaryTree();

void insert(const elemType& elem);
void remove(const elemType& elem);
void clear();

void preorder();
};

template<typename elemType>
BinaryTree<elemType>::BinaryTree() : root(0) {}

template<typename elemType>
inline BinaryTree<elemType>::~BinaryTree() {
clear();
}


template<typename elemType>
void BinaryTree<elemType>::insert(const elemType& elem) {
if( !root ) {
root = new Node( elem );
} else {
insert_value( elem, root );
}
}

template<typename elemType>
void BinaryTree<elemType>::insert_value( const elemType& elem, Node* node ) {
if(elem == node->value) {
node->cnt++;
return;
}
if(elem < node->value) {
if( !node->lchild )
node->lchild = new Node( elem );
else
insert_value( elem, node->lchild );
} else {
if( !node->rchild )
node->rchild = new Node( elem );
else
insert_value( elem, node->rchild );
}
}

template<typename elemType>
inline void BinaryTree<elemType>::clear() {
if( root ) {
clear( root );
root = 0;
}
}

template<typename elemType>
void BinaryTree<elemType>::clear(Node* node) {
if( node ) {
clear( node->lchild );
clear( node->rchild );
delete node;
}
}

template<typename elemType>
void BinaryTree<elemType>::remove( const elemType& elem ) {
if( root )
remove_value( elem, root );
}

template<typename elemType>
void BinaryTree<elemType>::remove_value( const elemType& elem, Node*& node ) {
if( elem < node->value ) {
if( node->lchild )
remove_value( elem, node->lchild );
} else if( elem > node->value ) {
if( node->rchild )
remove_value( elem, node->rchild );
} else {
Node* temp = node;
if( temp->rchild ) {
node = temp->rchild;
if( temp->lchild ) {
if( !node->lchild )
node->lchild = temp->lchild;
else
BinaryTree<elemType>::lchild_leaf(temp->lchild, node->lchild);
}
} else {
node = temp->lchild;
}
delete temp;
}
}

template<typename elemType>
inline void BinaryTree<elemType>::lchild_leaf(Node* leaf, Node* subtree) {
while( subtree->lchild )
subtree = subtree->lchild;
subtree->lchild = leaf;
}

template<typename elemType>
void BinaryTree<elemType>::preorder( Node* node ) {
if( node ) {
std::cout << node->value << endl;
if( node->lchild ) preorder( node->lchild );
if( node->rchild ) preorder( node->rchild );
}
}

template<typename elemType>
void BinaryTree<elemType>::preorder() {
preorder( root );
}

//: BinaryTree.cpp

#include "BinaryTree.h"
#include <string>
using namespace std;

int main() {
BinaryTree<string> bt;

bt.insert( "Piglet" );
bt.insert( "Eyeore" );
bt.insert( "Roo" );
bt.insert( "Tigger" );
bt.insert( "Chris" );
bt.insert( "Pooh" );
bt.insert( "Kanga" );
cout << "Preorder traversal ..." << endl;
bt.preorder();

cout << endl;
cout << "remove Roo ..." << endl;
bt.remove( "Roo" );
cout << "remove Pooh ..." << endl;
bt.remove( "Pooh" );
cout << "Preorder traversal again ..." << endl;
bt.preorder();
}
alula 2002-06-26
  • 打赏
  • 举报
回复
给你另一个类似的例子,<thinking in c++>影响下,做了许多修改的<essential c++>的例子. 有兴趣就看看吧。

//: BinaryTree.h

#include <iostream>

template<typename elemType>
class BinaryTree {
struct Node {
elemType value;
int cnt;
Node* lchild;
Node* rchild;

Node(const elemType& elem) : value(elem) {
cnt = 1;
lchild = rchild = 0;
}
}* root;

void insert_value( const elemType& elem, Node* node );
void remove_value( const elemType& elem, Node*& node );
void clear( Node* node );
static void lchild_leaf( Node* leaf, Node* subtree );
void preorder( Node* node );
public:
BinaryTree();
~BinaryTree();

void insert(const elemType& elem);
void remove(const elemType& elem);
void clear();

void preorder();
};

template<typename elemType>
BinaryTree<elemType>::BinaryTree() : root(0) {}

template<typename elemType>
inline BinaryTree<elemType>::~BinaryTree() {
clear();
}


template<typename elemType>
void BinaryTree<elemType>::insert(const elemType& elem) {
if( !root ) {
root = new Node( elem );
} else {
insert_value( elem, root );
}
}

template<typename elemType>
void BinaryTree<elemType>::insert_value( const elemType& elem, Node* node ) {
if(elem == node->value) {
node->cnt++;
return;
}
if(elem < node->value) {
if( !node->lchild )
node->lchild = new Node( elem );
else
insert_value( elem, node->lchild );
} else {
if( !node->rchild )
node->rchild = new Node( elem );
else
insert_value( elem, node->rchild );
}
}

template<typename elemType>
inline void BinaryTree<elemType>::clear() {
if( root ) {
clear( root );
root = 0;
}
}

template<typename elemType>
void BinaryTree<elemType>::clear(Node* node) {
if( node ) {
clear( node->lchild );
clear( node->rchild );
delete node;
}
}

template<typename elemType>
void BinaryTree<elemType>::remove( const elemType& elem ) {
if( root )
remove_value( elem, root );
}

template<typename elemType>
void BinaryTree<elemType>::remove_value( const elemType& elem, Node*& node ) {
if( elem < node->value ) {
if( node->lchild )
remove_value( elem, node->lchild );
} else if( elem > node->value ) {
if( node->rchild )
remove_value( elem, node->rchild );
} else {
Node* temp = node;
if( temp->rchild ) {
node = temp->rchild;
if( temp->lchild ) {
if( !node->lchild )
node->lchild = temp->lchild;
else
BinaryTree<elemType>::lchild_leaf(temp->lchild, node->lchild);
}
} else {
node = temp->lchild;
}
delete temp;
}
}

template<typename elemType>
inline void BinaryTree<elemType>::lchild_leaf(Node* leaf, Node* subtree) {
while( subtree->lchild )
subtree = subtree->lchild;
subtree->lchild = leaf;
}

template<typename elemType>
void BinaryTree<elemType>::preorder( Node* node ) {
if( node ) {
std::cout << node->value << endl;
if( node->lchild ) preorder( node->lchild );
if( node->rchild ) preorder( node->rchild );
}
}

template<typename elemType>
void BinaryTree<elemType>::preorder() {
preorder( root );
}

//: BinaryTree.cpp

#include "BinaryTree.h"
#include <string>
using namespace std;

int main() {
BinaryTree<string> bt;

bt.insert( "Piglet" );
bt.insert( "Eyeore" );
bt.insert( "Roo" );
bt.insert( "Tigger" );
bt.insert( "Chris" );
bt.insert( "Pooh" );
bt.insert( "Kanga" );
cout << "Preorder traversal ..." << endl;
bt.preorder();

cout << endl;
cout << "remove Roo ..." << endl;
bt.remove( "Roo" );
cout << "remove Pooh ..." << endl;
bt.remove( "Pooh" );
cout << "Preorder traversal again ..." << endl;
bt.preorder();
}
Rafaelkl 2002-06-26
  • 打赏
  • 举报
回复
你的代码写的太乱了,这个程序应该直接用两个数组存下两个序列,只要传几个定位的int 数值就可以了,否则像你的程序,速度太低了(不必要的损耗)
潘李亮 2002-06-26
  • 打赏
  • 举报
回复
//Tree_Node.h

#include<iostream>
using namespace std;
struct Tree_Node
{
char data;
Tree_Node *Lchild,*Rchild;
Tree_Node(char ch=' ');
~Tree_Node(){};
friend void crtree(Tree_Node *T, char a[],char b[], int n);
};

Tree_Node::Tree_Node(char ch)
{
data=ch;
Lchild=NULL;
Rchild=NULL;
}

//Bit_Tree.h
//#include<iostream>
//#include"Tree_Node.h"

class Bit_Tree
{
public:
//你的私有变量让外部怎么访问?
Tree_Node *bt_Node;
public:
Bit_Tree(){};
~Bit_Tree(){};
void cre();
void ShowTreeFirst();
void ShowTreeMiddle();
friend void crtree( Tree_Node *T,char a[],char b[],int m);
};

//BitTree.cpp
//#include"Bit_Tree.h"
void crtree(Tree_Node *T, char a[],char b[], int n);
void Bit_Tree::cre()//Bit_Tree()
{
cout<<"请输入结点个数:";
int n;
cin>>n;
cout<<endl;
char *a=new char[n];
char *b=new char[n];
cout<<"请输入先序序列:"<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
cout<<endl;
cout<<"请输入中序序列:"<<endl;
for(int j=0;j<n;j++)
cin>>b[j];
cout<<endl;
Tree_Node * newnode=new Tree_Node;
newnode->data=a[0];
bt_Node=newnode;
crtree(bt_Node=new Tree_Node,a,b,n);
//你分配的内存记得要释放掉
delete[] a;
delete[] b;
}
void crtree(Tree_Node * T, char a[],char b[], int n)
{
//递归的终止
if(n==0)
{
T->data=a[0];
return;
}
int m=0;
while((b[m]!=a[0])&&(m<n))
m++;
char *c=new char[m];
char *d=new char[m];
//划分两个序列的时候有错
int s=n-m-1;
char *e=new char[s];
char *f=new char[s];
//要正确的割出两个序列来
for(int i=0;i<m;i++)
{
c[i]=a[i+1];
d[i]=b[i];
}
for(int j=0;j<s;j++)
{
e[j]=a[j+m+1];
f[j]=b[j+m+1];
}
//因为你的根节点都是从调用前就已经创建好了的。
//所以你只要个他的数据域付值就可以了,然后是生成他的左右子树
//所以下面我给你注释掉的代码都是错误的

T->data=a[0];//这句就是付值

//创建左子树
Tree_Node *node1=new Tree_Node;
//node1->data=c[0];
T->Lchild=node1;
if(i!=0)
crtree(T->Lchild,c,d,i);
// cout<<'c'; //这句是用来检测的,但程序运行时根本没有c显示出来。

//创建右子树
Tree_Node *node2=new Tree_Node;
//node2->data=e[0];
T->Rchild=node2;
if(j!=0)
crtree(T->Rchild,e,f,j);

//你分配的内存记得要释放掉
delete[] c;
delete[] d;
delete[] e;
delete[] f;

}
void FirstViste(Tree_Node * bt)
{
if(bt!=NULL)
{
FirstViste(bt->Lchild);
cout<<bt->data;
FirstViste(bt->Rchild);
}
}


void main()
{
Bit_Tree binarytree;
binarytree.cre();
cout<<"该二叉树的中序序列为:"; //这一句也没有显示
FirstViste(binarytree.bt_Node);
cout<<endl;
}
wenature 2002-06-25
  • 打赏
  • 举报
回复
有没有C的?
LeeMaRS 2002-06-25
  • 打赏
  • 举报
回复
不知道你会不会看PASCAL.这是偶以前写的一个练习程序,根据先序 中序 建树并进行后序遍历输出的.你看看吧:)
-------------------------------------------
Program T2 (input,output);
Type
DataType = Char;
LinkType = ^NodeType;
NodeType = Record
Data : DataType;
LChild,RChild : LinkType;
End;

Var
DLRSerial,LDRSerial : String; {The input serial}
root : LinkType;

Procedure Make (DLRSerial,LDRSerial : String; nowroot : LinkType; MakeState : Boolean);
{MakeState : Left = Make LChild; Right = Make RChild}

Var
t : LinkType;
n : Char;
DLR_Left,DLR_Right : String;
LDR_Left,LDR_Right : String;
t1 : Integer;

Begin
n:=DLRSerial[1];
t1:=Pos(n,LDRSerial);
{Get the first node and split LDRSerial with it}

LDR_Left:=Copy(LDRSerial,1,t1-1);
LDR_Right:=Copy(LDRSerial,t1+1,Length(LDRSerial)-t1);

DLR_Left:=Copy(DLRSerial,2,Length(LDR_Left));
DLR_Right:=Copy(DLRSerial,2+Length(LDR_Left),Length(LDR_Right));

New(t);
t^.Data:=n;
t^.LChild:=NIL;
t^.RChild:=NIL;

If (root=NIL) Then
root:=t {Needn't to make it on left or right}
Else
If(MakeState=False) Then
nowroot^.LChild:=t
Else
nowroot^.RChild:=t;

If (DLR_Left<>'') Then Make(DLR_Left,LDR_Left,t,False);
If (DLR_Right<>'') Then Make(DLR_Right,LDR_Right,t,True);
End;

Procedure Output (t : LinkType);
Var
i : Char;
j,n : Byte;

Begin
If t^.LChild<>NIL Then
Output(t^.LChild);
If t^.RChild<>NIL Then
Output(t^.RChild);
Write(t^.Data);
End;

Begin
Write('Please input DLR Serial:');
Readln(DLRSerial); {先序}
Write('Please input LDR Serail:');
Readln(LDRSerial); {中序}

Make(DLRSerial,LDRSerial,root,False); {建树}
Write('LRD Serail:');
Output(root); {后序遍历}
Writeln;
End.
潘李亮 2002-06-25
  • 打赏
  • 举报
回复
cout<<"该二叉树的中序序列为:"; //这一句也没有显示
是因为你的流没有刷新,你加一句cout.flush()就有了
其它的东西,太长了,我没有时间调试,不好意思
rockyrambo 2002-06-25
  • 打赏
  • 举报
回复
gz

69,382

社区成员

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

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