您的位置:首页 > 理论基础 > 数据结构算法

【数据结构上机练习】6. 二叉树的简单操作(1)

2012-11-16 11:51 363 查看
上机4.1的题目

直接上代码:

//============================================================================
// Name        : 上机4.1  tree.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
/***
* 1、    定义链接存储的二叉树类。
2、    实验验证如下算法的正确性、各种功能及指标:
1)创建一棵二叉树,并对其初始化;
2)先根、中根、后根遍历二叉树;
3)在二叉树中搜索给定结点的父结点;
4)搜索二叉树中符合数据域条件的结点;
5)从二叉树中删除给定结点及其左右子树。
3、    为便于观察程序的运行结果,
设计的输出函数能在输出设备上以图形或表格或其它直观的形式展现、存储计算结果。
4、    测试程序时,对所有输入变量取遍各种有代表性的值。
5、    为了增强程序的可读性,程序中要有适当的注释。
*
*/
#include <iostream>

using namespace std;

typedef struct BinTreeNode{
char data;
struct BinTreeNode * left,*right;
}BinTreeNode;

class BinTree{
private:
BinTreeNode *root;
public:
BinTree(){root = NULL;}
BinTree(BinTreeNode & temp){
root = &temp;
temp.left = NULL;
temp.right = NULL;
}
BinTreeNode * creat(){ //递归创建树
char t;
cin>>t;
if(t=='#'){// #  stand for null
return NULL;
}
else{
BinTreeNode *r = new BinTreeNode;
r->data = t;
r->left = creat();
r->right = creat();
return r;
}
}
};
void preOrderTra(BinTreeNode *t){ //先跟便利
if(t){
cout<<t->data<<" ";
preOrderTra(t->left);
preOrderTra(t->right);
}
}
void midOrderTra(BinTreeNode *t){  //中跟遍历
if(t){
midOrderTra(t->left);
cout<<t->data<<" ";
midOrderTra(t->right);
}
}
void bacOrderTra(BinTreeNode *t){  //后跟遍历
if(t){
bacOrderTra(t->left);
bacOrderTra(t->right);
cout<<t->data<<" ";
}
}
BinTreeNode * findFather(BinTreeNode *t, const char &p){
//在t为跟的树中查找节点data p的父节点
BinTreeNode *q;
if(t== NULL) {
return NULL; //根为空
}
if(t->data==p) {
//cout<<"根节点就是"<<endl;
return t;
}
if(t->left==NULL||t->right==NULL){
//cout<<"叶节点"<<endl;
return NULL;
}
if(t->left->data == p||t->right->data == p){
//cout<<"找到了,返回"<<endl;
return t;// find it
}
if((q= findFather((t->left),p))!=NULL){
//cout<<"继续在左节点寻找"<<endl;
return q;   //在t的左子树继续递归寻找
}
else {
//cout<<"继续在右节点寻找"<<endl;
return findFather(t->right,p);  //否则在右子树寻找
}
}
BinTreeNode * find(BinTreeNode * q,const char &c){
BinTreeNode *p=NULL;
cout<<"find"<<endl;
if(q==NULL){
cout<<"root is null"<<endl;
return NULL;
}
if(q->data==c){   //要先判断值,再判断左右儿子是否为空!!!!!!!!!
cout<<"find it"<<endl;
return q; //find it
}

if(q->left==NULL){
cout<<"left is null"<<endl;
return NULL;
}
if(q->right==NULL){
cout<<"right is null"<<endl;
return NULL;
}

if((p=find(q->left,c))!=NULL){
cout<<"find left"<<endl;
return p;
}
else{
cout<<"find right"<<endl;
return find(q->right,c);
}
}

void delTree(BinTreeNode *r ,const char &c){
BinTreeNode *temp;
temp = findFather(r,c);
if(temp==NULL){
cout<<"not find char c!!!"<<endl;
return ;
}
if(temp->left->data==c){
temp->left=NULL;
}
if(temp->right->data==c){
temp->right=NULL;
}
cout<<"deleted!"<<endl;
return ;
}

int main() {
BinTree mb;
BinTreeNode *r;
cout<<"输入要创建的树,空节点用#代替\n";
r = mb.creat();
cout<<"先跟遍历"<<endl;
preOrderTra(r);
cout<<"\n中跟遍历"<<endl;
midOrderTra(r);
cout<<"\n后跟遍历"<<endl;
bacOrderTra(r);
cout<<"find"<<endl;
cout<<"A的父节点值为:"<<findFather(r,'A')->data<<endl;
cout<<"B的父节点值为:"<<findFather(r,'B')->data<<endl;
cout<<"C的父节点值为:"<<findFather(r,'C')->data<<endl;
cout<<"D的父节点值为:"<<findFather(r,'D')->data<<endl;
cout<<"E的父节点值为:"<<findFather(r,'E')->data<<endl;
cout<<"F的父节点值为:"<<findFather(r,'F')->data<<endl;
cout<<"-的父节点值为:"<<findFather(r,'-')->data<<endl;
BinTreeNode *temp;
temp = find(r,'A');
cout<<"find A:"<<temp->data;

delTree(r,'-');
cout<<"bianli:"<<endl;
preOrderTra(r);

return 0;
}


测试数据:

*+A##B##+*-C##D##E##F##

运行结果:eclipse下的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: