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 由中根顺序和后根序列重建二叉树
题目内容: 我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列.前根序列和后根序列.反过来,如果给定二叉树的中根序列和后根序列,或者给定中根序列和前根序列,可以重建一二叉树.本题输入一棵 ...
随机推荐
- 【学习记录】C#保存数据至CSV文档 & DateTime格式模式控制解释
数据类的定义: public class Result_Display { private string id; public string ID { get { return id; } set { ...
- OSCP Learning Notes - WebApp Exploitation(3)
SQL Injection[SQLi] Refrence: SQL Injection Authentication Bypass Cheat Sheet https://pentestlab.blo ...
- Python Ethical Hacking - Malware Analysis(4)
DOWNLOAD_FILE Download files on a system. Once packaged properly will work on all operating systems. ...
- P4017 最大食物链计数 (拓扑排序)
看到拓扑排序感觉非常遥远的复杂,不喜欢图.看了拓扑排序的原理,很像广搜. 以本题样例为例: 了解一下 出度 和 入度 5的出度为3 入度为 0 ,3的出度为2 入度为2…… for循环 找到秃头 5 ...
- 【JVM之内存与垃圾回收篇】方法区
方法区 前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈.堆.方法区 ...
- Java中的大数值使用
在Java中,偶尔会遇到超大数值,超出了已有的int,double,float等等你已知的整数.浮点数范围,那么可以使用java.math包中的两个类:BigInteger和BigDecimal. 这 ...
- 【Nginx】并发量太高,Nginx扛不住?这次我错怪Nginx了!!
写在前面 最近,在服务器上搭建了一套压测环境,不为别的,就为压测下Nginx的性能,到底有没有传说中的那么牛逼!具体环境为:11台虚拟机,全部安装CentOS 6.8 64位操作系统,1台安装部署Ng ...
- 【IJCAI2020】Split to Be Slim: An Overlooked Redundancy in Vanilla Convolution
Split to Be Slim: An Overlooked Redundancy in Vanilla Convolution, IJCAI 2020 论文地址: https://arxiv.or ...
- 朝阳大妈也能听懂的git教程 (好人不谢)
1 核心概念(非常简单) 分支 同一个树关节 长两个分叉 每一个树关节 就是一个commit commit 是纵向纬度的版本 分支(branch) 是横向纬度的版本 (发挥想象力 自己 ...
- Merging 和 Rebasing 的大比拼
虽然 merging 和 rebasing 在 git 中相似时,但他们提供不同的功能.为了让你的历史尽可能的干净和完整,你应该知道以下几点. git rebase 命令已 神奇的 Git voodo ...