每日一练——判断两序列是否为同一二叉搜索树序列

来源:互联网 发布:红包尾数控制软件 编辑:程序博客网 时间: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 总是感觉睡不够好困怎么办 两岁宝宝说有鬼怎么办 阳台改成了卧室晒衣服怎么办 室外墙角边墙泥受潮脱落怎么办 新房装修墙体发霉了怎么办 宝宝吃多了发烧怎么办 宝宝睡觉不爱盖被子怎么办 1岁宝宝不盖被子怎么办 2岁宝宝不盖被子怎么办 买的芬琳漆不够刷的怎么办 1.3米宽厨房门怎么办 墙面漆颜色刷深了怎么办 地板上沾了墙漆怎么办 孩子连发高烧8天了怎么办 孩子对数字不敏感怎么办 三岁宝宝不爱学习怎么办 5岁还不认识数字怎么办 小孩上中班还不认识数字怎么办 中班小孩数字都不认识怎么办 中班小孩记不住数字怎么办 中班小孩不肯练数字描红怎么办 2个月吃母乳婴儿缺钙怎么办 月经期接吻水多怎么办 4岁宝宝晚上尿多怎么办 2岁宝宝晚上尿多怎么办 3岁宝宝晚上尿多怎么办 宝宝拉肚子拉绿色的屎怎么办 婴儿吃奶粉大便干燥怎么办 母乳宝宝不拉大便怎么办 我儿子8岁拉肚子怎么办 1岁宝宝经常便秘怎么办 两个月宝宝拉水怎么办 宝宝吃奶粉上火便秘怎么办 20多天的宝宝便秘怎么办 宝宝五十天消化不良不拉屎怎么办 一周七个月宝宝消化不良拉屎怎么办 孩子总是消化不良拉屎不成型怎么办 一岁宝宝长牙慢怎么办 一岁宝宝不喝水怎么办 七个月的宝宝咳嗽怎么办 怀孕七个月感冒了怎么办