此为本人在学习数据结构时所写的,各个功能能够实现,有demo,tree.h,node.h,tree.cpp四个文件,使用说明如下:
按照要求输入,本程序的输入顺序是前序遍历的顺序,要求空节点用#代替,节点之间无空格。
如:ABD##E##CFH##I##GJ##KL##M##
前序遍历结果为ABD##E##CFH##I##GJ##KL##M##
中序遍历结果为#D#B#E#A#H#F#I#C#J#G#L#K#M#
后序遍历结果为##D##EB##H##IF##J##L##MKGCA
层次遍历结果为ABCDEFGHIJKLM
树高为5
结点数为13
demo.cpp文件

#include <iostream>
#include <string.h>
#include <assert.h>
#include <stdlib.h>//定义了一些宏和标准通用函数
#include <queue>//队列
#include <vector>//向量
#include "node.h"
#include "tree.h"
using namespace std;
typedef char E;
char c;
node* qianxucreat(){node* rt;cin>>c;if(c=='#'){rt=NULL;}else{rt=new node;rt->setElement(c);rt->setlift(qianxucreat());rt->setRight(qianxucreat());}return rt;//返回根节点
}
void qianxu(node*rt){if(rt!=NULL){cout<<rt->element()<<"";qianxu(rt->left());qianxu(rt->right());}else{cout<<"#";}
}
void zhongxu(node*rt){if(rt!=NULL){zhongxu(rt->left());cout<<rt->element()<<"";zhongxu(rt->right());}else{cout<<"#";}
}
void houxu(node*rt){if(rt!=NULL){houxu(rt->left());houxu(rt->right());cout<<rt->element()<<"";}else{cout<<"#";}
}
void cengci(node*rt){queue<node*>q;//定义队列if(rt!=NULL){q.push(rt);}node *b;while(!q.empty()){b=q.front();cout<<b->element()<<"";q.pop();if(b->left()){q.push(b->left());}if(b->right()){q.push(b->right());}}
}
int main(int argc, char** argv) {cout<<"------请选择操作序号:-----"<<endl;cout<<"------1.前序建树操作-------"<<endl;cout<<"------2.前序遍历-----------"<<endl;cout<<"------3.中序遍历-----------"<<endl;cout<<"------4.后序遍历-----------"<<endl;cout<<"------5.层次遍历-----------"<<endl;cout<<"------6.求树高和结点个数---"<<endl;cout<<"------7.查找功能-----------"<<endl;cout<<"------8.操作结束,清空-----"<<endl;node* r;tree t;int a,f=0;while(cin>>a){switch(a) {case 1:{if(f==0){cout<<"请按照前序遍历输入节点信息,空节点以#代替,节点之间无空格"<<endl;r=qianxucreat();t.setroot(r);//设置根节点if(t.empty(r)==1){cout<<"请选择其他操作"<<endl;f=1;}else{cout<<"这是空树,请重新选择"<<endl;}break;                 }else{cout<<"无法建立"<<endl;}}case 2:{//前序遍历 if(f==1){qianxu(r);cout<<endl;}else{cout<<"请先输入一棵树"<<endl;}break;}case 3:{//中序遍历 if(f==1){zhongxu(r);cout<<endl;}else{cout<<"请先输入一棵树"<<endl;}break;}case 4:{//后序遍历 if(f==1){houxu(r);cout<<endl;}else{cout<<"请先输入一棵树"<<endl;}break;}case 5:{if(f==1){//层次遍历 cengci(r);cout<<endl;}else{cout<<"请先输入一棵树"<<endl;}break;}case 6:{if(f==1){//树的深度和结点数 int deep=t.depth(r);cout<<"树高为:"<<deep<<endl;int num=t.count(r);cout<<"树的结点数为:"<<num<<endl;}else{cout<<"请先输入一棵树"<<endl;}break;}case 7:{//查找 if(f==1){cout<<"请输入查找的值,存在则返回,不存在返回0;"<<endl;char x;cin>>x;cout<<t.chazhao(r,x)<<endl;}else{cout<<"请先输入一棵树"<<endl;}break;}case 8:{//清空if(f==1){t.clear(r);f=0;}else{cout<<"请先输入一棵树"<<endl;}break;}}}return 0;
}

tree.h文件

#ifndef TREE_H
#define TREE_H
#include <queue>
#include "node.h"
#include <iostream>
using namespace std;
class tree:public node{private:char c;node* root;//根节点 public:node* Root(){return root;}//返回根节点void setroot(node* n){root=n;}//将n作为树的根节点bool empty(node*rt);//判断二叉树是否为空void qianxu(node*rt);//前序遍历 void zhongxu(node*rt);//中序遍历 void houxu(node*rt);//后序遍历 void cengci(node*rt);//层次遍历 int depth(node* rt);//二叉树深度 int count(node*rt);//结点数统计node* qianxucreat();//通过前序遍历的输出方式来建立二叉树 node* houxucreat(string cc,int n,int i);//通过后序遍历的输出方式来建立二叉树 bool chazhao(node*rt,char x);//查找某个x值void clear(node*rt);//清空二叉树
};#endif

tree.cpp文件

#include "tree.h"
#include <queue>
#include <iostream>
using namespace std;
bool tree::empty(node*rt){if(rt!=NULL)return true;else return false;
}
int tree::depth(node*rt){int lh=0,rh=0;if(rt!=NULL){lh=depth(rt->left());rh=depth(rt->right());return (lh>rh?lh:rh)+1;}else{return 0;}
}
int tree::count(node*rt){if(rt){return count(rt->left())+count(rt->right())+1;}else{return 0;}
}
bool tree::chazhao(node*rt,char x){if(rt==NULL){return rt;}else if(rt->element()==x){return true;}else{return chazhao(rt->left(),x)||chazhao(rt->right(),x);}
}
void tree::clear(node* rt){//清空二叉树if(rt!=NULL){clear(rt->left());clear(rt->right());delete rt;rt=NULL;//t要为空,否则输出时会是随机数 }
}
/*
node* tree::houxucreat(string cc,int n,int i){node* rt;c=cc[n-i-1];i++; if(i>n-1){return rt;}if(c=='#'){rt=NULL;}else{rt=new node;rt->setElement(c);rt->setRight(houxucreat(cc,n,i));rt->setlift(houxucreat(cc,n,i));}return rt;
}*/

node.h文件

#include "tree.h"
#include <queue>
#include <iostream>
using namespace std;
bool tree::empty(node*rt){if(rt!=NULL)return true;else return false;
}
int tree::depth(node*rt){int lh=0,rh=0;if(rt!=NULL){lh=depth(rt->left());rh=depth(rt->right());return (lh>rh?lh:rh)+1;}else{return 0;}
}
int tree::count(node*rt){if(rt){return count(rt->left())+count(rt->right())+1;}else{return 0;}
}
bool tree::chazhao(node*rt,char x){if(rt==NULL){return rt;}else if(rt->element()==x){return true;}else{return chazhao(rt->left(),x)||chazhao(rt->right(),x);}
}
void tree::clear(node* rt){//清空二叉树if(rt!=NULL){clear(rt->left());clear(rt->right());delete rt;rt=NULL;//t要为空,否则输出时会是随机数 }
}
/*
node* tree::houxucreat(string cc,int n,int i){node* rt;c=cc[n-i-1];i++; if(i>n-1){return rt;}if(c=='#'){rt=NULL;}else{rt=new node;rt->setElement(c);rt->setRight(houxucreat(cc,n,i));rt->setlift(houxucreat(cc,n,i));}return rt;
}*/

数据结构——二叉链表相关推荐

  1. 数据结构-二叉链表存储的二叉树(利用先序遍历)

    树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序.中序遍历 ...

  2. 数据结构-二叉链表的结构与实现

    目录 一.引言 二.什么是二叉链表 三.二叉链表的结构 四.二叉链表的实现 1. 创建二叉链表 2. 遍历二叉链表 3. 插入节点 4. 删除节点 五.应用场景 六.总结 七.代码示例 一.引言 数据 ...

  3. 6-2-二叉树(二叉链表存储)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第6章  树和二叉树 - 二叉树(二叉链表存储) --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴 ...

  4. c++数据结构二叉树(二叉链表实现)基本操作实现

    二叉树: 二叉树(Binary tree)是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二 ...

  5. 数据结构C++边学边做--二叉树的实现(二叉链表实现遍历操作)

    二叉树的实现(二叉链表实现遍历操作) 一.二叉树的遍历 二.二叉链表的数据结构定义 三.二叉链表类实现 1.类声明 2.BiTree->构造函数:Create创建二叉链表 3.~BiTree-& ...

  6. 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适

    题目 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适?(北京航空航天大学1999,北京工业大学2016) A. 前序 B. 中序 C. 后序 D. 层次 ...

  7. 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结

    假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结点和 node 结点).pat ...

  8. 【数据结构】基于二叉链表的二叉树结点个数的统计

    基于二叉链表的二叉树结点个数的统计 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别对二叉树的结点(度为0.1.2)个数进行统计. 输入 多组数据.每组数 ...

  9. 数据结构知识整理 - 建立二叉链表、复制二叉树、计算二叉树深度、统计二叉树结点数

    主要内容 建立二叉链表 复制二叉树 计算二叉树深度 统计二叉树的结点个数 建立二叉链表 在先序遍历的递归算法中,将输出语句改为输入语句即可.(可回顾"递归算法") 需要注意的是,递 ...

  10. 二叉链表-创建、遍历(前序、中序、后序、非递归、层次)、复制、计算深度、结点数、销毁(C语言)

    目录 二叉树的定义 二叉树的性质 二叉链表的基本操作 二叉链表的结构定义 前序遍历创建 前序.中序.后序遍历 中序遍历的非递归算法(栈) 层次遍历(队列) 复制二叉树 计算深度 计算总结点数与叶子结点 ...

最新文章

  1. 超硬核全套Java视频教程(学习路线+免费视频+配套资料)
  2. python真正实现多线程的方法_python多线程几种方法实现
  3. 安装了vmware tools后,自动调整大小-自动适应客户机仍为灰色(终极解决方案)
  4. 【计算机组成原理】逻辑运算
  5. 支持断线重连、永久watcher、递归操作 ZooKeeper 客户端
  6. Card Game Again CodeForces - 818E (双指针)
  7. linux将日期和日历信息追加到文件中_Linux常用指令
  8. 案例讲解asp.net中jquery post的用法
  9. 从0到1:微信后台系统的演进之路(转自INFOQ)
  10. css 网站素装 追忆过去
  11. HDU_2156 分数矩阵
  12. html中input描述,input的type值类型和描述-HTML
  13. 服务器网卡,10GE设备相关笔记
  14. 时域采样定理MATLAB实现
  15. 研发团队专业能力提升
  16. 2022年度“强国杯”选拔赛 WriteUp
  17. 每天学命令all_inputs
  18. 年底了,清空自己,让心归零!
  19. 小程序基础版本库与微信版本关系
  20. 一支笔的测试点_如何测试一支笔

热门文章

  1. 51单片机 code关键字
  2. 机器人新车号牌安装_他指挥机器人给新车“穿衣” 分分钟搞定
  3. Proteus 8.9下载安装指南
  4. Physics Bodies(中文翻译)—UE4官方文档
  5. 懒人网址导航源码v2.4.5 自适应
  6. 深入浅出数据分析(一)——MySQL+EXCEL+R统计问卷调查
  7. 电商常用三大数据分析模型--深入浅出
  8. Python 快速入门实战教程
  9. 51单片机控制电机正反转
  10. FTPSFTP的基本命令