OJ 正则二叉树(使用递归)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Stark_JC/article/details/82290485

问题

给定一颗二叉查找树,其中结点上存储整数关键字,请你判断它是否一棵正则二叉树,即每个内部结点均有两个子结点。

输入

第一行是测试样例数 T(T <= 20),接下来是 T 个测试样例。对于每个测试样例,第一行是二叉树结点个数 n (n <= 30),第二行是一个含有n个关键字的序列,表示二叉树的先序遍历结果。保证关键字均不相同。

输出

如果二叉查找树是正则的,则输出“YES”, 否则输出”NO”,每个输出占一行。

输入样例

5
2
10 5
3
1 4 7
3 
5 3 2
3
10 4 23
5
10 6 5 8 20

输出样例

NO
NO
NO
YES
YES

思路

由于是先序遍历,一个整数串可以分为三部分:sub = [root, (left), (right)]
1. len(sub)==0,说明为叶子节点,返回true。
2. len(sub)%2==0,说明是偶数,必然不是正则的,返回false.
3. 其他情况,len(sub)必然是大于等于3的,可以用递归的思想,分别判断left区域和right区域是否正则。

代码

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

bool testRegex(vector<int> &vec, int from, int end)
{
    if ((end-from+1) % 2 == 0)
        return false;

    if (end == from)
        return true;

    int index;
    for (int i = from+1; i <= end; i++){
        if (vec[i]>vec[from]){
            index = i;
            break;
        }
    }
    if (testRegex(vec, from+1, index - 1) && testRegex(vec, index, end))
        return true;
    return false;
}

int main()
{
    int len;
    cin >> len;
    for (int i = 0; i < len; i++){
        int n;
        vector<int> vec;
        int tmp;
        cin >> n;
        for (int j = 0; j < n; j++){
            cin >> tmp;
            vec.push_back(tmp);
        }
        if (testRegex(vec, 0, n-1))
            cout << "YES\n";
        else
            cout << "NO\n";
    }
    system("pause");
    return 0;
}
展开阅读全文

没有更多推荐了,返回首页