【数据结构上机练习】6. 二叉树的简单操作(1)
2012-11-16 11:51
363 查看
上机4.1的题目
直接上代码:
测试数据:
*+A##B##+*-C##D##E##F##
运行结果:eclipse下的
直接上代码:
//============================================================================ // 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下的
相关文章推荐
- 【数据结构上机练习】7. 二叉树的简单操作(2)
- 【数据结构上机练习】4.链表的简单操作(2)
- 【数据结构上机练习】5.栈的简单操作(2)
- 【数据结构上机练习】3.栈的简单操作
- 【数据结构】二叉树的简单操作及简单应用
- 【数据结构】二叉树的简单遍历及基本操作
- 【 数据结构】实现二叉树以及其基本操作
- 数据结构上机测试2-2:单链表操作B
- 数据结构上机测试2-2:单链表操作B
- 结构体,文件操作,指针,简单练习
- Streams 一个操作简单的数据结构,很像数组或链接表
- 简单二叉树操作
- 数据结构复习——二叉树的几个基本操作
- 二叉树的基本操作(定义、遍历、高度、生成)【数据结构】
- 【l练习代码】有序二叉树的操作
- 数据结构:链表的简单操作
- 数据结构之二叉树的简单操作
- 二叉树的简单操作
- 数据结构 — 二叉树的基本操作(递归实现)
- 数据结构练习---遍历序列与二叉树的复原