C++实现二叉树的链接存储结构(先根、中根和后根遍历)
验证二叉树的链接存储结构及其上的基本操作。
[实验要求]:
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++实现二叉树的链接存储结构(先根、中根和后根遍历)的更多相关文章
- C++实现线性表的链接存储结构(单链表)
将线性表的抽象数据类型定义在链接存储结构下用C++的类实现,由于线性表的数据元素类型不确定,所以采用模板机制. 头文件linklist.h #pragma once #include <iost ...
- C#数据结构-二叉树-链式存储结构
对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...
- 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现
如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...
- 利用设置新数据存储结构解决vue中折叠面板双向绑定index引起的问题
问题背景是,在进行机器性能可视化的前端开发时,使用折叠面板将不同机器的性能图表画到不同的折叠面板上去.而机器的选择利用select下拉选项来筛选. 由于在折叠面板中,通过 如下v-model双向绑定了 ...
- 树和二叉树->存储结构
文字描述 1 二叉树的顺序存储 用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素. 这种顺序存储只适用于完全二叉树.因为,在最坏情况下,一个深度为k且只有k个结点的单支树却需要长度 ...
- java资料——顺序存储结构和链式存储结构(转)
顺序存储结构 主要优点 节省存储空间,随机存取表中元素 缺 点 插入和删除操作需要移动元素 在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构. 顺序存储结 ...
- kafka 数据存储结构+原理+基本操作命令
数据存储结构: Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的.每个topic又可以分成几个不同的partition(每个topic有几个partitio ...
- 9.1 Linux存储结构和文件系统
1. 存储结构 Linux系统中的一切文件都是从"根"目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途. 目录名称 应放置文件的 ...
- OpenJudge 由中根顺序和后根序列重建二叉树
题目内容: 我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列.前根序列和后根序列.反过来,如果给定二叉树的中根序列和后根序列,或者给定中根序列和前根序列,可以重建一二叉树.本题输入一棵 ...
随机推荐
- wordpress学习笔记
版本:4.9.8 我用wordpress的初衷是借用它的后台系统,前端用自己的网页显示存在wordpress数据库里的文章. wordpress本质上是个框架,技术栈:web-php-mysql. 初 ...
- k8s极简史:K8s多集群技术发展的历史、现状与未来
引子 随着云原生技术的普及,越来越多的企业使用Kubernetes来管理应用,并且集群规模也呈爆发式增长,企业也亟需应对随集群规模增长而带来的各种挑战.同时,为了更好地提供高可用.弹性伸缩的应用,企业 ...
- Saas Erp以及分销 助手
首先贴一下相关的截图 SaasErp 登陆页 Saas Erp主页 Saas Erp 其中的商品页 Saas Erp 打印模板设计页 分销助手登录页/手势密码页/主页 1.SaaS是Software ...
- 题解 SP687 【REPEATS - Repeats】
考虑可以枚举字符串上的两个点,求出两个点所对应后缀的\(LCP\)和所对应前缀的\(LCS\),两点之间的距离为\(len\),则这两个点对答案的贡献为: \[ \frac{LCS+LCP+L-1}{ ...
- 【管理员已阻止你运行此应用】windows defender图标打叉,无法打开mmc.exe解决办法
今天开机遇到一个奇怪的问题,发现windows defender图标上面打了个×: 打开按照系统提示需要restart服务,但是无法重启服务,会出现错误,然后尝试手动重启服务,准备打开管理控制台mmc ...
- 在Ubuntu 18.04中安装Wine QQ、微信、TIM
近日重新安装了Ubuntu 18.04,因此要重新安装一下Wine QQ.微信之类的,完整安装Wine系列软件一直是一个老大难的问题,网上搜集到的博客也比较零散,因此这里特此写篇博客记录一下 0. 这 ...
- windows异常-环境变量
问题现象: 高级设置:windows 找不到文件 %windir%\systempropertiesadvanced.exe 请确定文件是否正确后,再试一次 基础信息: windows7 专业版 问题 ...
- ctime使用及datetime简单使用
from time import ctime,sleep def Clock(func): def clock(): print("现在是:",ctime()) func() sl ...
- UDP 绑定信息
""" 建立->绑定本地ip地址和端口号->接收数据->转码输出->关闭客户端 """ from socket im ...
- PHP time_sleep_until() 函数
实例 延迟执行当前脚本直到 10 秒: <?php// wake up ten seconds from nowtime_sleep_until(time()+10);?>高佣联盟 www ...