验证二叉树的链接存储结构及其上的基本操作。

[实验要求]:
1. 从文件创建一棵二叉树,并对其初始化;
2. 先根、中根、后根遍历二叉树;
3. 在二叉树中搜索给定结点的父结点;
4. 搜索二叉树中符合数据域条件的结点;
5. 从二叉树中删除给定结点及其左右子树。

[截图]:
1. 文件截图

2. 操作截图

[实现代码]:
分成三个文件tree.h、tree.cpp和main.cpp

tree.h:

#ifndef _TREE_H
#define _TREE_H
#include<iostream>
#include<fstream>
using namespace std;
class Node{
private:
Node *right;
Node *left;
public:
char data;
Node(const char&item,Node*lptr=NULL,Node*rptr=NULL):data(item),left(lptr),right(rptr){}
Node*getleft(void)const{return left;}
void setleft(Node*L){left=L;}
Node*getright(void)const{return right;}
void setright(Node*R){right=R;}
char&getdata(){return data;}
void setdata(const char&item){data=item;}
};
class tree{
private:
Node *root;
char stop;
public:
tree(Node*t=NULL):root(t){}
~tree(){delete root;}
void createtree();
Node*create(char*a);
Node*getroot(){return root;}
void setstop(char stop) {this->stop=stop;}
Node*father(Node*root,Node*son);
Node*find(Node*root,const char&item)const;
void preorder(Node*root)const;
void inorder(Node*root)const;
void postorder(Node*root)const;
void levelorder(Node*root)const;
void deletesth(Node*t);
};
#endif

tree.cpp:
createtree函数中有打开文件操作记得修改

#include<iostream>
#include<fstream>
#include<cstdlib>
#include"tree.h"
using namespace std;
char stop=;
int ii=;
int xx=;
Node*tree::create(char *a){
Node*root, *root1, *root2;
char userInput;
userInput=a[xx];
xx++;
if(userInput==stop){
root=NULL;
return root;
}
else{
root=new Node(userInput,NULL,NULL);
if(!root)
return NULL;
root1=create(a);
root->setleft(root1); //设置左子树
root2=create(a);
root->setright(root2); //设置右子树
return root;
}
}
void tree::createtree(){
char userStop;
char a[];
ifstream file("tree.txt");
if(!file.is_open()){
cout<<"文件打开失败!"<<endl;
exit();
}
file>>userStop;
setstop(userStop);
while(!file.eof()){
file>>a[ii];
ii++;
}
root=create(a);
}
Node*tree::father(Node*root,Node*son){
Node*temp;
if(root==NULL||son==NULL)
return NULL;
if(root->getleft()==son||root->getright()==son)
return root;
temp=father(root->getleft(),son);
if(temp!=NULL)
return temp;
else
return father(root->getright(),son);
}
Node*tree::find(Node * root,const char& item)const{
Node*temp;
if(root==NULL)
return NULL;
if(root->getdata()==item)
return root;
temp=find(root->getleft(),item);
if(temp!=NULL)
return temp;
else
return find(root->getright(),item);
}
void tree::preorder(Node*root)const{
if(root!=NULL) {
cout<<root->getdata()<<" ";
preorder(root->getleft());
preorder(root->getright());
}
}
void tree::inorder(Node*root)const {
if(root != NULL) {
inorder(root->getleft());
cout<<root->getdata()<<" ";
inorder(root->getright());
}
}
void tree::postorder(Node*root)const{
if(root!=NULL){
postorder(root->getleft());
postorder(root->getright());
cout<<root->getdata()<<" ";
}
}
void tree::deletesth(Node*t){
if(t==NULL)return;
if(t==root){
delete(t);
root=NULL;
return;
}
Node*p,*q;
p=t;
q=father(root,p);
if(q){
if((q->getleft())==p)q->setleft(NULL);
if((q->getright())==p)q->setright(NULL);
}
delete(p);
}

main.cpp:

#include<iostream>
#include<fstream>
#include"tree.h"
#include"tree.cpp"
using namespace std;
int main(){
char Input;
tree b2,bt;
Node*father;
Node*temp;
b2.createtree();
while(){
cout<<endl<<"先根遍历:";
b2.preorder(b2.getroot());
cout<<endl<<"中根遍历:";
b2.inorder(b2.getroot());
cout<<endl<<"后根遍历:";
b2.postorder(b2.getroot());
cout<<endl<<"请输入欲查找结点的值:";
cin>>Input;
temp=b2.find(b2.getroot(),Input);
if(temp==NULL){
cout<<"无该结点!!!"<<endl;
}
else{
cout<<"结点为:"<<temp<<endl;
temp->data='*';
b2.preorder(b2.getroot());
cout<<endl;
b2.inorder(b2.getroot());
cout<<endl;
b2.postorder(b2.getroot());
cout<<endl;
temp->data=Input;
}
cout<<"请输入子结点的值:";
cin>>Input;
temp=b2.find(b2.getroot(),Input);
father=b2.father(b2.getroot(),temp);
if(father==NULL) {
cout<<"无该结点!!!"<<endl;
}
else{
cout<<"其父结点为:"<<father->getdata()<<endl;
}
cout<<"请输入想要删除结点的值:";
cin>>Input;
temp=b2.find(b2.getroot(),Input);
b2.deletesth(temp);}
return ;
}

C++实现二叉树的链接存储结构(先根、中根和后根遍历)的更多相关文章

  1. C++实现线性表的链接存储结构(单链表)

    将线性表的抽象数据类型定义在链接存储结构下用C++的类实现,由于线性表的数据元素类型不确定,所以采用模板机制. 头文件linklist.h #pragma once #include <iost ...

  2. C#数据结构-二叉树-链式存储结构

    对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...

  3. 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

    如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...

  4. 利用设置新数据存储结构解决vue中折叠面板双向绑定index引起的问题

    问题背景是,在进行机器性能可视化的前端开发时,使用折叠面板将不同机器的性能图表画到不同的折叠面板上去.而机器的选择利用select下拉选项来筛选. 由于在折叠面板中,通过 如下v-model双向绑定了 ...

  5. 树和二叉树->存储结构

    文字描述 1 二叉树的顺序存储 用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素. 这种顺序存储只适用于完全二叉树.因为,在最坏情况下,一个深度为k且只有k个结点的单支树却需要长度 ...

  6. java资料——顺序存储结构和链式存储结构(转)

    顺序存储结构 主要优点 节省存储空间,随机存取表中元素 缺    点 插入和删除操作需要移动元素 在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构. 顺序存储结 ...

  7. kafka 数据存储结构+原理+基本操作命令

    数据存储结构: Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的.每个topic又可以分成几个不同的partition(每个topic有几个partitio ...

  8. 9.1 Linux存储结构和文件系统

    1. 存储结构 Linux系统中的一切文件都是从"根"目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途. 目录名称 应放置文件的 ...

  9. OpenJudge 由中根顺序和后根序列重建二叉树

    题目内容: 我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列.前根序列和后根序列.反过来,如果给定二叉树的中根序列和后根序列,或者给定中根序列和前根序列,可以重建一二叉树.本题输入一棵 ...

随机推荐

  1. CSS上划线、下划线、删除线等方法

    text-decoration:underline;     下划线 text-decoration:overline;    顶划线 text-decoration:line-through;  删 ...

  2. P4017 最大食物链计数 (拓扑排序)

    看到拓扑排序感觉非常遥远的复杂,不喜欢图.看了拓扑排序的原理,很像广搜. 以本题样例为例: 了解一下 出度 和 入度 5的出度为3 入度为 0 ,3的出度为2  入度为2…… for循环 找到秃头 5 ...

  3. TeamX

    介绍 TeamX 是基于 SolonJT 平台构建的团队管理小工具,主要功能有: Wiki(团队词条,用于写MD格式接口文档也行...) Planned(项目计划 和 个人日志) Issues(问题管 ...

  4. Java常用开源库

    Java的经久不衰,很大程度上得益于Java的生态好.在日常开发中,我们也会经常使用到各种开源库和工具类,为了避免重复造轮子,本文将贴出工作及学习中会用到的部分开源库和工具类.Java的生态实在太大, ...

  5. maven&nexus_repository 私库搭建与使用

    一.nexus仓库安装 1,http://www.sonatype.org/nexus/    下载sso版本,免费2,tar -zxvf nexus-2.11.1-01-bundle.tar.gz3 ...

  6. 洛谷 P1080 国王游戏 题解

    原题 传送门 思路 分析 我们先假设队伍如下: People left hand right hand Before \(S_a\) A \(a_1\) \(b_1\) B \(a_2\) \(b_2 ...

  7. react实战 : react 与 svg

    有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个波浪效果组件,而这个一般用 SVG 做. 所以就变成了在 react 中使用 SVG 的问题. 首先是波浪效果需要的样式. . ...

  8. IOS上传图片方向问题

    在显示上传完毕的图片的时候遇到了一个问题, 图片莫名其妙被逆时针旋转了90度就很离谱 如下图 经过一番查询, 原来是 IOS 的相机拍照的时候会把方向角写入到图片里面 因为我用的是 element 的 ...

  9. stm32-HAL库串口收发

    串口发送 重写fputc函数 /* 优点 直接使用printf函数,发送数据长度无限制,不需要额外的数组空间 缺点 只能对应一个串口,暂时没想到解决方案 */ //头文件中要包含 stdio.h 然后 ...

  10. Python编程导论第2版|百度网盘免费下载|新手学习

    点击下方即可免费下载 百度网盘免费下载:Python编程导论第2版 提取码:18g5 豆瓣评论: 介绍: 本书基于MIT 编程思维培训讲义写成,主要目标在于帮助读者掌握并熟练使用各种计算技术,具备用计 ...