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

[实验要求]:
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. bilibili自定义调整视频播放速度

    自定义调整视频播放速度 在b站的播放页面,按下f12,打开控制台 在控制台中复制下面代码,想几倍速就把2.5改成你想要的播放速度 document.querySelector('video').pla ...

  2. IDEA JRebel热部署( IDEA版本是2020.1.2)

    1.安装JRebel插件 在IDEA->Settings->plugins先安装JRebel插件: 2.下载工具 安装好JRebel后,找到lanyus大神文章中写的git地址:http: ...

  3. tensorflow对鸢尾花进行分类——人工智能入门篇

    tensorflow之对鸢尾花进行分类 任务目标 对鸢尾花数据集分析 建立鸢尾花的模型 利用模型预测鸢尾花的类别 环境搭建 pycharm编辑器搭建python3.* 第三方库 tensorflow1 ...

  4. Shell基本语法---处理海量数据的sed命令

    sed命令 shell脚本三剑客之一 处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到 ...

  5. C++语法小记---前置操作符和后置操作符

    前置操作符和后置操作符 单独的"++i"和"i++"是否有区别 对于基本类型: 二者没有区别,因为编译器会对代码进行优化,二者的汇编代码完全相同 对于类类型: ...

  6. create-react-app中的babel配置探索

    版本 babel-loader version:"8.1.0" create-react-app:"3.4.1" 三个配置 第一部分: { test: /\.( ...

  7. H5移动端,ios从后台返回到app,页面会白一下

    visibilitychange事件可以检查从后台返回事件,然后通过添加div,强制浏览器刷新页面 var divEle = document.createElement("DIV" ...

  8. 【CVPR2020】Wavelet Integrated CNNs for Noise-Robust Image Classification

    深度学习中的下采样(max-pooing, average-pooling, strided-convolution)通常会有两个不足:破坏了目标的基本结构.放大随机噪声.上采样操作同样容易受到影响. ...

  9. 递归-N皇后问题

    // // #include <stdio.h> /*可以用回溯,但是我已经不太熟悉回溯了!!!!!!!!呜呜呜 * */ #include <iostream> #inclu ...

  10. PHP usort() 函数

    ------------恢复内容开始------------ 实例 使用用户自定义的比较函数对数组 $a 中的元素进行排序:Sort the elements of the $a array usin ...