描述

假设二叉树每个结点的元素均为一个单字符,根据给定的字符序列按照先序遍历的顺序递归创建该树的二叉链表,然后判断该二叉树是否为二叉排序树。

输入

多组数据,每组数据有一行。每行为一个二叉树对应的前序序列(其中‘#’表示空树)。当序列为“#”时,输入结束。

输出

每组数据输出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++,附思路)相关推荐

  1. 4018-基于非递归的二叉排序树的结点的查找和插入(C++,附思路)

    描述 已知二叉树T的结点形式为(llink,data,count,rlink),在树中查找值为x的结点,若找到,则计数(count)加1:否则,作为一个新结点插入树中,插入后仍为二叉排序树.请写出其非 ...

  2. 4021-基于链地址法的散列表的删除(C++,附思路)

    描述 请写出在散列表中删除关键字为k的一个记录的算法,设散列函数为H,H(key)=key%13,解决冲突的方法为链地址法. 输入 多组数据,每组三行,第一行为待输入的关键字的个数n,第二行为对应的n ...

  3. 4010-基于邻接矩阵的边的删除(C++,附思路)

    描述 给定一个无向图,在此无向图中删除一条边.(题目写错字了) 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k, ...

  4. 4008-基于邻接矩阵的新边的增加(C++,附思路)

    描述 给定一个无向图,在此无向图中增加一条边. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的两个 ...

  5. 【折半查找判定树画法思路】

    折半查找判定树画法思路: 1.先画出满足有序表长度的最大满二叉树,然后将剩余结点个数一个个插入该树.[二叉树前n层最多(2^n)-1个结点,第n层最多2^(n-1)个结点] 2,从上往下看,比较每个结 ...

  6. 4020-基于链地址法的散列表的插入(C++,附思路以及头插法,尾插法两种代码)

    描述 请写出在散列表中插入关键字为k的一个记录的算法,设散列函数为H,H(key)=key%13,解决冲突的方法为链地址法. 输入 多组数据,每组三行,第一行为待输入的关键字的个数n,第二行为对应的n ...

  7. 4009-基于邻接表的边的删除(C++,附思路)

    描述 给定一个无向图,在此无向图中删除一条边. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的两个 ...

  8. 4017-二叉排序树的限定条件下的数据输出(C++,附思路及建立时的可能错误排查)

    描述 已知二叉排序树采用二叉链表存储结构,根结点的指针为T,链结点的结构为(lchild,data,rchild),其中lchild.rchild分别指向该结点左,右孩子的指针,data域存放结点数据 ...

  9. 4014-基于邻接表的长度为k的简单路径的求解(C++,附思路)

    描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...

最新文章

  1. django学习笔记--数据库中的多表操作
  2. 01_Nginx安装,nginx下部署项目,nginx.conf配置文件修改,相关文件配置
  3. KindEditor 插件API使用说明
  4. wxpython bind自定义_wxpython 支持python语法高亮的自定义文本框控件的代码
  5. ORA-01092解决一例
  6. 设计模式C++学习笔记之二(Proxy代理模式)
  7. 从王者荣耀看设计模式(一.策略模式)
  8. php redis 集群 长连接池,php如何实现redis连接池
  9. 02WCF初识:ServiceEndpoint
  10. linux 远程安装teamviewer,如何在CentOS 7上安装TeamViewer
  11. 天地不仁,以万物为刍狗
  12. (附源码课件)10款Java小游戏满足你各种需求
  13. unit怎么发音_“unit”怎么读?
  14. 名悦集团:冬季汽车开暖风有哪些注意事项
  15. 对自己的反思 (闲暇中的面试总结)
  16. 小程序发布线上接口请求失败,开发者工具请求正常,体验版和开发版要打开调试才可以正常请求解决办法
  17. 万字长文带你探究 Docker 容器化技术背后的黑科技
  18. 用C/C++写一个简单的音乐播放器(基于windows控制台编程)
  19. echarts中设置地图背景图片
  20. 快速理解Linux系统中用户和组的概念及如何查看存储用户与组信息的文件/etc/passwd,/etc/shadow,/etc/group及其子段意思

热门文章

  1. 计算机网络技术放块队解说词,基于《计算机网络技术》课程多媒体课件制作与设计.doc...
  2. uniapp中自定义导航栏动态获取高度
  3. wangEditor-3.1.1 自己扩展的,增加代码块行号
  4. SpringBoot官方提供的starter pom
  5. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索
  6. Bootstrap分页传值问题
  7. 华为机试题【11】-报数删除人
  8. Sql中对大数据量的判断
  9. 10分钟让你学会使用Vuex
  10. 文件和异常 Python