每日一练——判断两序列是否为同一二叉搜索树序列
来源:互联网 发布:红包尾数控制软件 编辑:程序博客网 时间:2024/05/23 18:33
题目描述:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输入例子:
2
567432
543267
576342
0
输出例子:
YES
NO
#include <stdio.h>#include <vector>#include <string>#include <iostream>using namespace std;bool Judge(vector<int> &tree, vector<int> &obj){ if (tree.size() == 0 && obj.size() == 0) { return true; } if (tree.size() != obj.size() || tree[0] != obj[0]) { return false; }vector<int> tree_left; vector<int> tree_right; vector<int> obj_left; vector<int> obj_right; for (int i = 1; i < tree.size(); i++) { if (tree[i] < tree[0]) { tree_left.push_back(tree[i]); } else { tree_right.push_back(tree[i]); } if (obj[i] < obj[0]) { obj_left.push_back(obj[i]); } else { obj_right.push_back(obj[i]); } } return Judge(tree_left, obj_left) && Judge(tree_right, obj_right);} int main(){ vector<int> tree, obj;string str_tree;string str_obj;int n;while (cin >> n && n){cin >> str_tree;for (int i = 0; i < str_tree.size(); i++){tree.push_back(str_tree[i] - '0');}for (int i = 0; i < n; i++){cin >> str_obj;obj.clear();for (int j = 0; j < str_obj.size(); j++){obj.push_back(str_obj[j] - '0');}if (Judge(tree, obj)){cout << "YES" << endl;}else{cout << "NO" << endl;}}} return 0;}
类似的题:
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路:
sequence中从start到end,可以看成三个部分,最后一个是根节点,第一部分的所有数据均小于根节点,第二部分的所有数据均大于根节点。注意第一部分可能为空,第二部分也可能为空。先找到第一部分和第二部分的分割点,从分割点开始到end-1均为第二部分,如果第二部分中有数据小于根节点,说明该序列不存在
如果start > end说明数组已经递归完,返回true。
代码如下:
class Solution {public: bool CheckPortOrderSequence(vector<int> sequence, int start, int end) { if (start > end) return true; int root_val = sequence[end]; int separate = start; for (;separate < end && sequence[separate] < root_val; separate++); for (int i = separate; i < end; i++) { if (sequence[i] < root_val) return false; } return CheckPortOrderSequence(sequence, start, separate - 1 ) && CheckPortOrderSequence(sequence, separate, end - 1); } bool VerifySquenceOfBST(vector<int> sequence) {if(sequence.size() == 0) return false; return CheckPortOrderSequence(sequence, 0, sequence.size() - 1); }};
类似的题:
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: unsigned int cur = 0; TreeNode* KthNode(TreeNode* pRoot, unsigned int k) { TreeNode *left, *right; if (cur > k || pRoot == NULL) return NULL; left = KthNode(pRoot->left, k); cur++; if (cur == k) { return pRoot; } right = KthNode(pRoot->right, k); if (left != NULL) { return left; } return right; }};
0 0
- 每日一练——判断两序列是否为同一二叉搜索树序列
- 判断两序列是否为同一二叉搜索树序列
- 判断两序列是否为同一二叉搜索树序列
- 数据结构课程设计(C语言)——判断两序列是否为同一二叉搜索树
- 数据结构与算法问题 判断两序列是否为同一二叉搜索树序列
- 二叉树——判断整数序列是否为二叉搜索树的后序序列
- 剑指offer——判断一个序列是否为二叉搜索树的后序遍历
- 判断二叉搜索树是否为后序遍历序列
- 每日一练(41) - 二叉搜索树的后序遍历序列
- 二叉树系列——判断一个序列是不是一棵二叉搜索树的遍历序列
- 输入一个数列,判断是否为某一个二叉搜索树的后序遍历序列
- 判断给定的数组是否为二叉搜索树的后序遍历序列
- 判断某序列是否为某二叉搜索树的后序遍历
- 二叉搜索树的后序遍历序列序列判断是否是二叉搜索树
- 判断两个二叉搜索树序列是否一致
- 每日一练之Palindrome Number【LeetCode No.9】—判断是否为回文数
- 判断序列是否为二叉树后序遍历
- 每日一练(40) - 判断二叉树是否是一颗平衡二叉树
- 如何压缩pdf文件 把pdf文件变小
- Android 5.1.1 源码目录结构
- String、StringBuffer、StringBuilder的比较
- C语言入门(十五)函数递归
- 【TJOI & HEOI 2016】【BZOJ 4554】【JZOJ 4612】 游戏
- 每日一练——判断两序列是否为同一二叉搜索树序列
- 【MVC5】4.添加一个模型
- 在gitlab中对git stash的学习
- WSAEventSelect(事件选择)模型
- jsp里面相对路径显示不出来图的问题
- TestNG入门笔记[3]: 使用testng.xml来执行case
- mem management
- java 两个字符串取交集
- 『MySQL』索引类型 normal, unique, full text