搜索树判断 (25 分)(先序建立二叉树)
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
题目思路:
代码稍微长了一点,但是思路还是比较清晰的
#include<iostream>
using namespace std;typedef struct tree {int data;tree* left;tree* right;
} *BinTree;
BinTree BST(int *pre, int len);
BinTree MirBST(int *pre, int len);
void LRD(BinTree T);
int flag1 = 0;
int flag2 = 0;int ar[1000], k = 0;
int main()
{int preorder[1000];int n;cin >> n;for (int i = 0; i < n; i++)cin >> preorder[i];BinTree T1 = BST(preorder, n);BinTree T2 = MirBST(preorder, n);if (T1 && flag1 == 0){cout << "YES\n";LRD(T1);for (int i = 0; i < n; i++){if (i)cout << " ";cout << ar[i];}}else if (T2 && flag2 == 0){cout << "YES\n";LRD(T2);for (int i = 0; i < n; i++){if (i) cout << " ";cout << ar[i];}}else{cout << "NO\n";}return 0;
}
BinTree BST(int *pre, int len)
{if (len == 0)return NULL;BinTree T = new tree;T->data = *pre;int m;for ( m = 1; m < len; m++)if (pre[m] >= T->data) //二叉搜索树右侧大于等于T->data,将m调整到T右子树第一个位置break;int n;for (n = m; n < len; n++)if (pre[n] < T->data) //如果T的右子树中有节点的值小于T的data{flag1 = 1; //该二叉树不是二叉搜索树return NULL;}T->left = BST(pre + 1, m - 1);T->right = BST(pre + m, len - m);return T;
}BinTree MirBST(int *pre, int len)
{if (len == 0)return NULL;BinTree T = new tree;T->data = *pre;int m;for (m = 0; m < len; m++) //镜像二叉搜索树右侧严格小于T->data,找到第一个右子树的位置if (pre[m] < T->data)break;int n;for (n = m; n < len; n++)if (pre[n] >= T->data) //如果镜像二叉树的右子树有一个大于等于T->data的节点{flag2 = 1; //该镜像二叉树不是镜像搜索二叉树return NULL;}T->left = MirBST(pre + 1, m - 1);T->right = MirBST(pre + m, len - m);return T;
}
void LRD(BinTree T)
{if (T){LRD(T->left);LRD(T->right);ar[k++] = T->data;}
}
搜索树判断 (25 分)(先序建立二叉树)相关推荐
- 7-28 搜索树判断 (25 分)(思路加详解) just easy!
一:题目 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树. 现在我们给出一个 ...
- 【CCCC】L2-012 关于堆的判断 (25分),,手写堆,二叉树编号,向上调整
problem L2-012 关于堆的判断 (25分) 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: ...
- 【IT笔试面试题整理】给定二叉树先序中序,建立二叉树的递归算法
[试题描述]: 给定二叉树先序中序,建立二叉树的递归算法 其先序序列的第一个元素为根节点,接下来即为其左子树先序遍历序列,紧跟着是右子树先序遍历序列,固根节点已可从先序序列中分离.在中序序列中找到 ...
- 7-42 关于堆的判断 (25 分)
7-42 关于堆的判断 (25 分) 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y a ...
- 【CCCC】L2-030 冰岛人 (25分) 模拟题,二叉树链式存储,从底部向上
problem L2-030 冰岛人 (25分) 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普 ...
- 6-2 是否二叉搜索树 (25 分)
大一下半期数据结构 是否二叉搜索树 本题要求实现函数,判断给定二叉树是否二叉搜索树. 函数接口定义: bool IsBST ( BinTree T ); 其中BinTree结构定义如下: typede ...
- 中序建立二叉树,非递归前序遍历二叉树
内容: 编写程序,实现下述功能,并上机调试通过. 按中序顺序建立一棵二叉树: 用非递归方式遍历二叉树(先序),输出遍历序列. 步骤: 算法分析 采用二叉链表做存储结构,建立二叉树,借助于栈结构来实现二 ...
- l2-004 这是二叉搜索树吗? (25分)_什么是 “线段树” ?
线段树是一个复杂的数据结构,比较难理解,也比较难解释清楚.在我将这个数据结构反复学习了五遍的时候,我终于有了信心写出这篇介绍线段树的文章.希望大家能够掌握这种数据结构. 这篇文章比较长,建议大家耐心阅 ...
- 【解析】基础实验4-2.5 关于堆的判断 (25 分)
立志用最少的代码做最高效的表达 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y are ...
- 关于堆的判断 (25 分)
题目: 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y are siblings:x和y ...
最新文章
- vue全家桶 ---axios的使用和二次封装
- 实至名归!ACM宣布深度学习三巨头共同获得图灵奖
- from server sql 拼接统计两个子查询_4复杂查询-SQL
- Tomcat中的字体请求跨域问题解决
- junit 内部类测试_Springboot 使用单元测试
- android代码获取应用名称,Android获取应用程序名称(ApplicationName)
- OpenCV训练分类器
- 用python画数学函数图像教程_Python 绘制你想要的数学函数图形
- 中台到底是什么?传统企业怎样建设中台?
- dnf显示与服务器数据异常怎么办啊,DNF:你这该死的数据异常网络中断连接,让我心在痛泪在流...
- sqlite to mysql_SqliteToMysql官方下载
- ラブ・ストーリーは突然に(突然發生的愛情故事)歌詞
- vue+webpack实现一个todolist
- 稳压二极管(齐纳Zener二极管)的接法和应用详解
- CAD导出.eps格式图
- java对比两张图片是否一致_Java实现图片对比功能
- 数据之美(九):50个精美绝伦的 Infographics(上)
- Delphi线程类的使用(1)
- pip 升级到最近21.0.1 后报错 sys.stderr.write(f“ERROR: {exc}“)
- C语言程序设计谭浩强版 九