4016-二叉排序树的判定(C++,附思路)
描述
假设二叉树每个结点的元素均为一个单字符,根据给定的字符序列按照先序遍历的顺序递归创建该树的二叉链表,然后判断该二叉树是否为二叉排序树。
输入
多组数据,每组数据有一行。每行为一个二叉树对应的前序序列(其中‘#’表示空树)。当序列为“#”时,输入结束。
输出
每组数据输出1行,若此二叉树为二叉排序树则输出“YES”,否则输出“NO”。
输入样例 1
ba##c##
ca##b##
#
输出样例 1
YES NO
思路:
这道题用到了二叉树的创建和遍历的思路,以及二叉排序树的定义,如果忘了记得先去复习!
设置一个全局变量flag用来存储该树是否是二叉排序树。
在遍历树的时候,如果该树有左右两个节点,那么比较两个节点里的data和当前根节点的data大小,只要有一个不符合大小关系就置flag=1并return,否则继续按先序遍历遍历该树的左右节点,只有其中一个叶子节点的情况同理。
最后看输出,只要flag==0就是YES,否则输出NO。
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<set>
#include<map>
using namespace std;int flag = 0;
typedef struct BNode
{char data;struct BNode* lchild, * rchild;
}*BTree, BNode;
void Create(BTree& bt, string s, int &i)
{if (s[i] == '#')bt = NULL;else{bt = new BNode;bt->data =s[i];Create(bt->lchild, s,++i);Create(bt->rchild, s,++i);}
}
void Traverse(BTree bt)
{if (bt){if (bt->lchild && bt->rchild){if (bt->lchild->data > bt->data || bt->rchild->data < bt->data){flag = 1;return;}else{Traverse(bt->lchild);Traverse(bt->rchild);}}else if (bt->lchild && !bt->rchild){if (bt->lchild->data > bt->data){flag = 1;return;}else Traverse(bt->lchild);}else if (!bt->lchild && bt->rchild){if (bt->rchild->data < bt->data){flag = 1;return;}else Traverse(bt->rchild);}}}
int main()
{string s;while (cin >> s && s != "#"){BTree bt;int i = -1;Create(bt, s, ++i);Traverse(bt);if (flag == 0)cout << "YES" << endl;else cout << "NO" << endl;flag = 0;}return 0;
}
4016-二叉排序树的判定(C++,附思路)相关推荐
- 4018-基于非递归的二叉排序树的结点的查找和插入(C++,附思路)
描述 已知二叉树T的结点形式为(llink,data,count,rlink),在树中查找值为x的结点,若找到,则计数(count)加1:否则,作为一个新结点插入树中,插入后仍为二叉排序树.请写出其非 ...
- 4021-基于链地址法的散列表的删除(C++,附思路)
描述 请写出在散列表中删除关键字为k的一个记录的算法,设散列函数为H,H(key)=key%13,解决冲突的方法为链地址法. 输入 多组数据,每组三行,第一行为待输入的关键字的个数n,第二行为对应的n ...
- 4010-基于邻接矩阵的边的删除(C++,附思路)
描述 给定一个无向图,在此无向图中删除一条边.(题目写错字了) 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k, ...
- 4008-基于邻接矩阵的新边的增加(C++,附思路)
描述 给定一个无向图,在此无向图中增加一条边. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的两个 ...
- 【折半查找判定树画法思路】
折半查找判定树画法思路: 1.先画出满足有序表长度的最大满二叉树,然后将剩余结点个数一个个插入该树.[二叉树前n层最多(2^n)-1个结点,第n层最多2^(n-1)个结点] 2,从上往下看,比较每个结 ...
- 4020-基于链地址法的散列表的插入(C++,附思路以及头插法,尾插法两种代码)
描述 请写出在散列表中插入关键字为k的一个记录的算法,设散列函数为H,H(key)=key%13,解决冲突的方法为链地址法. 输入 多组数据,每组三行,第一行为待输入的关键字的个数n,第二行为对应的n ...
- 4009-基于邻接表的边的删除(C++,附思路)
描述 给定一个无向图,在此无向图中删除一条边. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的两个 ...
- 4017-二叉排序树的限定条件下的数据输出(C++,附思路及建立时的可能错误排查)
描述 已知二叉排序树采用二叉链表存储结构,根结点的指针为T,链结点的结构为(lchild,data,rchild),其中lchild.rchild分别指向该结点左,右孩子的指针,data域存放结点数据 ...
- 4014-基于邻接表的长度为k的简单路径的求解(C++,附思路)
描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...
最新文章
- django学习笔记--数据库中的多表操作
- 01_Nginx安装,nginx下部署项目,nginx.conf配置文件修改,相关文件配置
- KindEditor 插件API使用说明
- wxpython bind自定义_wxpython 支持python语法高亮的自定义文本框控件的代码
- ORA-01092解决一例
- 设计模式C++学习笔记之二(Proxy代理模式)
- 从王者荣耀看设计模式(一.策略模式)
- php redis 集群 长连接池,php如何实现redis连接池
- 02WCF初识:ServiceEndpoint
- linux 远程安装teamviewer,如何在CentOS 7上安装TeamViewer
- 天地不仁,以万物为刍狗
- (附源码课件)10款Java小游戏满足你各种需求
- unit怎么发音_“unit”怎么读?
- 名悦集团:冬季汽车开暖风有哪些注意事项
- 对自己的反思 (闲暇中的面试总结)
- 小程序发布线上接口请求失败,开发者工具请求正常,体验版和开发版要打开调试才可以正常请求解决办法
- 万字长文带你探究 Docker 容器化技术背后的黑科技
- 用C/C++写一个简单的音乐播放器(基于windows控制台编程)
- echarts中设置地图背景图片
- 快速理解Linux系统中用户和组的概念及如何查看存储用户与组信息的文件/etc/passwd,/etc/shadow,/etc/group及其子段意思