finalbst.h

//该程序的作用是根据所给的前序序列以及中序序列或者中序序列以及后序序列创建二叉树
#include <iostream>
#include <vector>
using namespace std;
typedef int datatype;struct node{datatype data;node *Lchild;node *Rchild;node *Rpar;        //右孩子的双亲节点 node *Lpar;      //左孩子的双亲节点 node *nxt;node *lst;
};class BST{public:BST();void createpre(vector<datatype>&pre, vector<datatype>&mid);        //1、该函数将元素按前序、中序储存在两个vector容器中 node* buildpre(vector<datatype>pre,vector<datatype>mid);         //2、调用1创建好的参数,创建二叉树 void createpos(vector<datatype>&pos,vector<datatype>&mid);           //3、该函数将元素按后序、中序序列存在两个vector容器中 node*buildpos(vector<datatype>pos, vector<datatype>mid);            //4、调用 3创建好的参数,创建二叉树 int printBST(node*curr);                                            //5、显示二叉树 bool ifBST();                                                     //6、通过key的值判断二叉树是否是搜索树 node*returnroot();                                                   //7、返回根节点 int JudgeBST(node*curr);                                          //8、判断是否是二叉搜索树,并给出key值 /*函数2配合函数1使用函数5配合函数7使用函数6配合函数8使用函数8配合函数7使用以上函数用来创建二叉树以及判断是否为二叉搜索树*/int convert(node*curr);                                            //7、将二叉搜索树转换为双向链表void printChain();                                     //8、显示双向链表 private:node*root;node*head;datatype rootdata;       //储存根节点的值 int size;     //树的节点数 int key;        //判断是否是BST
};

finalbst.cpp

#include<iostream>
#include"finalbst.h"
using namespace std;BST::BST(){root=new node();key = 1;       //初始化key值为1 head=new node();cout<<"初始化完成";
}void BST::createpre(vector<datatype>&pre, vector<datatype>&mid){cout<<"输入前序序列,输入-1停止" <<endl; datatype a;while(cin>>a&&a!=-1){pre.push_back(a); }rootdata=pre[0]; cout<<"输入中序序列,输入-1停止"<<endl;datatype b;while(cin>>b&&b!=-1){mid.push_back(b);}
}node*BST::buildpre(vector<datatype>pre, vector<datatype>mid){size = pre.size();       //调用头文件vector.h中的函数返回当前容器的大小 if(size==0)  return NULL;node*curr;curr=new node();curr->data=pre[0];       //当前节点对应当前根节点 vector<datatype>Lpre, Rpre, Lmid, Rmid;if(curr->data==rootdata) root=curr;        //确定根节点 int currpos;        //记录当前节点在mid中的位置 for(int i=0;i<size;i++)if(mid[i]==pre[0]){currpos=i;break;}for(int i=0;i<size;i++){     //对左右子树的前中序列容器进行装填 if(i<currpos){Lpre.push_back(pre[i+1]);Lmid.push_back(mid[i]);}if(i>currpos){Rpre.push_back(pre[i]);Rmid.push_back(mid[i]);}}curr->Lchild=buildpre(Lpre, Lmid);       //布置当前节点的左右子树 curr->Rchild=buildpre(Rpre, Rmid);return curr;        //该函数返回的值是当前函数参数对应的根节点
}void BST::createpos(vector<datatype>&pos, vector<datatype>&mid){datatype a,b;cout<<"输入中序序列:(按-1停止)"<<endl;while(cin>>a&&a!=-1){mid.push_back(a);}cout<<"输入后序序列:(按-1停止)"<<endl;while(cin>>b&&b!=-1){pos.push_back(b);}size=pos.size();rootdata=pos[size-1];//cout<<rootdata;
}node*BST::buildpos(vector<datatype>pos, vector<datatype>mid){size=pos.size();if(size==0) return NULL;node *curr;curr=new node();curr->data=pos[size-1];if(curr->data==rootdata) root=curr;int currpos=0;while(mid[currpos]!=curr->data){currpos++;}vector<datatype>Lpos, Lmid, Rpos, Rmid;for(int i=0;i<size;i++){if(i<currpos){Lpos.push_back(pos[i]);Lmid.push_back(mid[i]);}if(i>currpos){Rpos.push_back(pos[i-1]);Rmid.push_back(mid[i]);}}curr->Lchild=buildpos(Lpos, Lmid);curr->Rchild=buildpos(Rpos, Rmid);return curr;
}int BST::printBST(node*curr){      //在该函数中布置双亲指针 if(curr==NULL) return 0;if(curr->Lchild!=NULL||curr->Rchild!=NULL)cout<<"根节点"<<curr->data<<endl;if(curr->Lchild!=NULL) {cout<<"左孩子"<<curr->Lchild->data<<endl;curr->Lchild->Lpar=curr;}if(curr->Rchild!=NULL){cout<<"右孩子"<<curr->Rchild->data<<endl<<endl; curr->Rchild->Rpar=curr;} printBST(curr->Lchild);printBST(curr->Rchild);
}int BST::JudgeBST(node*curr){if(curr==NULL) return 0;if(curr->Lchild!=NULL&&curr->Rchild!=NULL)if(curr->Lchild->data>=curr->data||curr->Rchild->data<=curr->data){key=0;return 0;}else if(curr->Lchild!=NULL&&curr->Rchild==NULL)if(curr->Lchild->data>=curr->data){key = 0;return 0;}else if(curr->Rchild!=NULL&&curr->Lchild==NULL)if(curr->Rchild->data<=curr->data){key = 0;return 0;}JudgeBST(curr->Lchild);JudgeBST(curr->Rchild);
}bool BST::ifBST(){if(key==1) return true;else return false;
}node*BST::returnroot(){return root;
}int BST::convert(node*curr){if(curr==NULL) return 0;//cout<<curr->data<<"  ";//测试 if(curr->Rchild==NULL&&curr->Lchild==NULL) return 0;if(curr==root){if(curr->Rchild!=NULL&&curr->Lchild!=NULL){curr->Lchild->nxt=curr;curr->lst=curr->Lchild;curr->nxt=curr->Rchild;curr->Rchild->lst=curr;}else if(curr->Rchild!=NULL&&curr->Lchild==NULL){curr->nxt=curr->Rchild;curr->Rchild->lst=curr;}else if(curr->Lchild!=NULL&&curr->Rchild==NULL){curr->Lchild->nxt=curr;curr->lst=curr->Lchild;}}else if(curr->Lpar!=NULL){if(curr->Rchild!=NULL&&curr->Lchild!=NULL){if(curr->lst!=NULL&&curr->lst->data<=curr->Lchild->data){curr->lst->nxt=curr->Lchild;curr->Lchild->lst=curr->lst;} curr->nxt=curr->Rchild;curr->Rchild->lst=curr;curr->Rchild->nxt=curr->Lpar;curr->Lpar->lst=curr->Rchild;curr->Lchild->nxt=curr;curr->lst=curr->Lchild;}else if(curr->Rchild!=NULL&&curr->Lchild==NULL){curr->nxt=curr->Rchild;curr->Rchild->lst=curr;curr->Rchild->nxt=curr->Lpar;curr->Lpar->lst=curr->Rchild;}else if(curr->Rchild==NULL&&curr->Lchild!=NULL){if(curr->lst!=NULL&&curr->lst->data<=curr->Lchild->data){curr->lst->nxt=curr->Lchild;curr->Lchild->lst=curr->lst;} curr->Lchild->nxt=curr;curr->lst=curr->Lchild;}}else if(curr->Rpar!=NULL){if(curr->Rchild!=NULL&&curr->Lchild!=NULL){if(curr->nxt!=NULL&&curr->nxt->data>=curr->Rchild->data){curr->Rchild->nxt=curr->nxt;curr->nxt->lst=curr->Rchild;}curr->nxt=curr->Rchild;curr->Rchild->lst=curr; curr->Lchild->nxt=curr;curr->lst=curr->Lchild;curr->Rpar->nxt=curr->Lchild;curr->Lchild->lst=curr->Rpar;}else if(curr->Rchild==NULL&&curr->Lchild!=NULL){curr->Lchild->nxt=curr;curr->lst=curr->Lchild;curr->Rpar->nxt=curr->Lchild;curr->Lchild->lst=curr->Rpar;}else if(curr->Rchild!=NULL&&curr->Lchild==NULL){if(curr->nxt!=NULL&&curr->nxt->data>=curr->Rchild->data){curr->Rchild->nxt=curr->nxt;curr->nxt->lst=curr->Rchild;}curr->nxt=curr->Rchild;curr->Rchild->lst=curr;}}convert(curr->Lchild);convert(curr->Rchild);
}void BST::printChain(){node *curr;curr=root;while(curr->lst!=NULL){//system("PAUSE");//测试 curr=curr->lst;//cout<<curr->data<<endl;//测试 }//cout<<root->lst<<endl;//测试 //cout<<root->data<<endl;//测试 while(curr!=NULL){//system("PAUSE");//测试 //cout<<curr<<":"<<curr->data<<"  ";//测试cout<<curr->data<<"  "; curr=curr->nxt;}
}int main(){//前序:9 4 2 1 3 6 5 7 13 11 10 12 15 14 16//中序:1 2 3 4 5 6 7 9 10 11 12 13 14 15 16//前序:5 3 2 4 7 6 8 9//中序:2 3 4 5 6 7 8 9 BST use;cout<<"1、前序+中序     2、后序+中序"<<endl;int a;cin>>a;if(a==1){vector<datatype>pre;vector<datatype>mid;use.createpre(pre, mid);use.buildpre(pre, mid);}else{vector<datatype>pos;vector<datatype>mid;use.createpos(pos, mid);use.buildpos(pos, mid);}use.printBST(use.returnroot());     //函数返回值作参数 use.JudgeBST(use.returnroot());      //判断是否是二叉搜索树,并为key赋值if(use.ifBST()==true){cout<<"是BST"<<endl<<"开始转换BST为双向链表"<<endl;use.convert(use.returnroot());cout<<"转换完成"<<endl<<"开始显示双链表"<<endl;use.printChain();}else cout<<"不是BST"<<endl;return 0;
}

前序中序、后序中序遍历创建二叉树,并检验是否是二叉搜索树,若是则转换为双向链表相关推荐

  1. 剑指Offer(Java版):二叉搜索树的后序遍历序列

    2019独角兽企业重金招聘Python工程师标准>>> 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组 ...

  2. 剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...

  3. 后序线索树怎样画图_算法新解刘新宇(二)二叉搜索树:数据结构中的“hello world”...

    二叉搜索树BST定义: 基于广义二叉树,一颗二叉树定义:或者为空 或者包含三部分:一个值,一个左分支和一个右分支.这两个分支也都是二叉树分支.一颗二叉搜索树是满足下面条件的二叉树:所有左分支的值都小于 ...

  4. LeetCode 255. 验证前序遍历序列二叉搜索树(单调栈)*

    文章目录 1. 题目 2. 解题 2.1 递归超时解 2.2 单调栈 1. 题目 给定一个整数数组,你需要验证它是否是一个二叉搜索树正确的先序遍历序列. 你可以假定该序列中的数都是不相同的. 参考以下 ...

  5. 二叉搜索树+快速排序 查到文本中出现频率最多的100个词 【留学生作业】

    完整工程 https://download.csdn.net/download/renzemingcsdn/21378979 需求 在这个作业中,你将从一个大文本文件中找到100个最经常出现的单词.程 ...

  6. 刷题记录8---验证二叉搜索树+二叉树的层序遍历+从前序与中序遍历序列构造二叉树+二叉树展开为链表+二叉树的最近公共祖先

    前言 所有题目均来自力扣题库中的hot 100,之所以要记录在这里,只是方便后续复习 98.验证二叉搜索树 题目: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树. 有效 二叉搜 ...

  7. 根据前序遍历和中序遍历创建二叉树

    根据前序遍历和中序遍历创建二叉树 题目要求如下: 给定某一个二叉树的前序遍历和中序遍历,要求据此创建一颗符合这样遍历顺序的二叉树. 前序遍历和中序遍历的概念以及特性: 前序遍历:先遍历节点本身,再遍历 ...

  8. 173. 二叉搜索树迭代器/94. 二叉树的中序遍历/145. 二叉树的后序遍历/98. 验证二叉搜索树

    2020-05-12 1.题目描述 二叉搜索树迭代器 2.题解 对于二叉搜索树而言,进行中序遍历就可以得到其有序序列,我们可以先对树进行遍历,将结果保存在 vector中,然后进行计算即可. 3.代码 ...

  9. PAT甲级1043 Is It a Binary Search Tree :[C++题解]判断二叉搜索树BST、给定前序序列和中序序列

    文章目录 题目分析 题目链接 题目分析 二叉搜索树(BST):左子树小于根结点,右子树大于等于根结点. 二叉搜索树的中序遍历一定是有序序列.所谓中序遍历:先访问左子树,再访问根结点,最后访问右子树. ...

最新文章

  1. 程序员的十层楼(第11层)
  2. linux关路由器,安全关闭 Linux 的方式
  3. springMVC 的工作原理和机制
  4. map的key可以试一个数组吗?_二维数组的 DP
  5. greenplum配置高可用_0665-6.2.0-如何在CDH中配置HMS高可用
  6. PHP面向对象常见符号总结($this- 、self ::)
  7. html中文字空心如何设置,css 中字体文本小诀窍
  8. Sugar Bytes WOW2 for Mac - 多功能滤波效果器
  9. linux软件有什么特点是什么,Linux系统,Win7系统,DOX系统各有什么特点?哪个系统好点?...
  10. 上海电信宽带自助修复服务器,家庭网络故障自助修复法
  11. MySQL彻底卸载教程
  12. Qt: 信号与槽机制
  13. itunes gift card apple id 充值接口API秒冲接口收藏
  14. python爬取五百丁ppt模板(有图+有代码)
  15. 什么是http服务器
  16. 解读arduino读取模拟信号实例
  17. sourcetree添加gitignore不生效解决方案
  18. ux设计_UX设计趋势回顾展2019
  19. MySQL实战演练——如何才能构建逾期用户画像?【数据可视化】
  20. Startup is Ready,Geek to Startup!

热门文章

  1. 实时的空号检测API,稳定可靠
  2. JavaScript中遍历数组小问题
  3. Freenom注册域名和账号并设置DNS到DNSPOD的方法
  4. 【深度学习】经典神经网络 ResNet 论文解读
  5. yolov系列-yolov1-论文详解
  6. 分解连续自然数的和_正整数分解为几个连续自然数之和-阿里云开发者社区
  7. join on and
  8. 博客作者简介--Dynamics 365技术到项目经理之路
  9. 视通科技音视频解决方案
  10. 查看浪潮服务器光口端口信息,Inspur FS6700 48端口 16Gb光模块12口*** 光纤交换机 浪潮 存储交换机...