PAT 4-1 CheckBST[1]

Given a binary tree, you are supposed to tell if it is a binary search tree. If the answer is yes, try to find the KK-th largest key, else try to find the height of the tree.

Format of function:

int CheckBST ( BinTree T, int K );

where BinTree is defined as the following:

typedef struct TNode *BinTree;
struct TNode{
    int Key;
    BinTree Left;
    BinTree Right;
};

The function CheckBST is supposed to return the K-th largest key if T is a binary search tree; or if not, return the negative height of T (for example, if the height is 55, you must return -5?5).

Here the height of a leaf node is defined to be 1. T is not empty and all its keys are positive integers. K is positive and is never more than the total number of nodes in the tree.

Sample program of judge:

#include <stdio.h>
#include <stdlib.h>

typedef struct TNode *BinTree;
struct TNode{
    int Key;
    BinTree Left;
    BinTree Right;
};

BinTree BuildTree(); /* details omitted */
int CheckBST ( BinTree T, int K );

int main()
{
    BinTree T;
    int K, out;

    T = BuildTree();
    scanf("%d", &K);
    out = CheckBST(T, K);
    if ( out < 0 )
        printf("No.  Height = %d\n", -out);
    else
        printf("Yes.  Key = %d\n", out);

    return 0;
}
/* 你的代码将被嵌在这里 */

Sample Input 1: (for the following tree)

4

Sample Output 1:

Yes.  Key = 5

Sample Input 2: (for the following tree)

3

Sample Output 2:

No.  Height = 3

解答其实过这题一个是用广度优先求出高度,另一个是用堆栈实现中缀遍历然后检查是否为从小到大的顺序遍历,啊哈三种遍历的递归解和非递归解都很重要的啦。
int CheckBST ( BinTree T, int K ){
    int level_index[1000], tmp[1000], i, j = 0, k =0, tail = 1, top = -1;
    BinTree Q[1000], Stack[1000];

    Q[0] = T;
    level_index[j] = 0;
    for(i = 0; i < 100; i++){
        if(NULL != Q[i]->Left){
            Q[tail++] = Q[i]->Left;
        }
        if(NULL != Q[i]->Right){
            Q[tail++] = Q[i]->Right;
        }
        if(i == level_index[j]&&level_index[j] != tail - 1){
            level_index[++j] = tail - 1;
        }
        else if(i == level_index[j]&&level_index[j] == tail - 1){
            break;
        }
    }
    while(-1 != top||NULL != T){
            while(NULL != T){
                Stack[++top] = T;
                T = T->Left;
            }
            T = Stack[top];
            top--;
            tmp[k++] = T->Key;
            T = T->Right;
        }
    for(k = 0; k < i; k++){
        if(tmp[k] >= tmp[k + 1]){
            return -1 - j;
        }
    }
    return tmp[i + 1 - K];
}
时间: 2024-10-26 21:35:10

PAT 4-1 CheckBST[1]的相关文章

PAT 1009 说反话 C语言

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格. 输出格式:每个测试用例的输出占一行,输出倒序后的句子. 输入样例: Hello World Here I Come 输出样例: Come I Here World Hello 1 #include<stdio.h> 2 #

PAT 1006 换个格式输出 C语言

让我们用字母B来表示"百".字母S表示"十",用"12...n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个"百".3个"十".以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出格式:每个测试用例的输出占一行,用规定的格式输出n. 输入样例1: 234 输出样例1: BBSSS1

俺也晒晒pat代码!

最近在练习pat,很多题目不是很好做,一直找不到思路.通过google题目名称可以找到很多前辈的做题记录,这极大的方便了后来者.在此默默谢谢他们! 不过这同时也带了一些问题,有些前辈可能是急于出结果,所以使用了非常麻烦的方法把题目做出来了,有些后来者不经思考草草学习了就也这么做了...俺觉得这不应当是刷题所追求的目标,俺觉得既然练习旧的题目就应当追求超越前人,多想想有没有更巧妙,更简便的方法.否则科学技术也就停滞不前了... 不过俺又想了想或许很多“大牛”的确使用了简单的方法,只是他们没有时间或

pat 1068 动态规划/Fina More Conis

1068. Find More Coins (30) Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special re

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)

开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感. L1-1  就不说了... L1-2 打印沙漏 一个变量保存空格数,一个变量保存沙漏符号数,打印就行了,但这题话说wrong好几次啊,坑点是沙漏符号后面不打印空格,orz... <span style="font-size:14px;">#include<iostream> #include<stdio.h> #include<math.h

1093. Count PAT&#39;s (25)

The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and the 6th characters, and the second one is formed by the 3rd, the 4th, and the 6th characters. Now given any string, you are supposed to tell the numb

关于PAT和《构建之法》

这是官网的介绍——计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准.我觉得PAT的真正价值在于帮助那些学历或者专业不太好的人突破壁垒,也就是通过HR第一轮的刷简历,后面的流程还是需要自己有真才实学才可以啊.陈越姥姥致力于把PAT打造成IT业的托福,而事实上也确实如此,如今已初具规模,参加一次这样的考试,对我这种编程渣来说

2015/12/12 考了PAT,又回来玩Python了。

上次写飞机大战的坑还没填完,然后就有好长时间没有更新博客了.可能大家在疑惑我在干什么... 其实不是有意暂停博客更新的,十一月学校里有两个考试要准备,然后有好多实验要做.平时的课余时间本来就不是很多了,然后整个十一月份都在学习数据结构和算法的东西,因为报名了浙大组织的PAT考试,12月5号刚考完试.基本上就是有空的时候就是刷算法题了.. 高估了考试的难度,只报名了乙级的考试,发现自己报亏了...练习的时候这些真题基本上都能拿到满分,不过在考试的时候发现各种情况突发,还是没有自己平时的发挥..一不