北邮2012复试机考 3T

97. 二叉排序树

时间限制 1000 ms 内存限制 65536 KB

题目描述

二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:

  1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
  2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
  3. 左、右子树本身也是一颗二叉排序树。

现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。

输入格式

第一行,一个数字N(N<=100),表示待插入的节点数。

第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过108。

输出格式

输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值

输入样例

5
2 5 1 3 4

输出样例

-1
2
2
5
3

分析 : STL中的 set 和 map 都是用二叉排序树实现的,这道题要输出父节点,用这两个不好实现,        解决方法是自己写一个返回父节点的二叉排序树代码:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
struct node
{
    int val;
    node *lch,*rch;
};

node *insert(node *p,int x)
{
    if(p==NULL)
    {
        node *q=new node;
        q->val=x;
        q->lch=q->rch=NULL;
        return q;
    }
    else
    {
        if(x< p->val)
            p->lch=insert(p->lch,x);
        else
            p->rch=insert(p->rch,x);
        return p;
    }
}

node *find(node *p,int x,node *my)
{
    if(p==NULL)
        return my;
    else if(x==p->val)
        return my;
    else if(x< p->val)
        return find(p->lch,x,p);
    else
        return find(p->rch,x,p);
}

int main()
{
    int num,temp[105],n;
    node *donser=NULL,*don=NULL,*dons=NULL;
    scanf("%d",&num);
    for(int i=1;i<=num;i++)
    {
        scanf("%d",&n);
        donser=insert(donser,n);
        temp[i]=n;
    }
    cout<<"-1"<<endl;
    for(int i=2;i<=num;i++)
    {
        dons=find(donser,temp[i],don);
        cout<< dons->val <<endl;
    }
    return 0;
}

 
时间: 2024-08-22 18:43:54

北邮2012复试机考 3T的相关文章

北邮软院机试2018

1.二进制数字调转 题目描述:一个2^32的数字n,将其转换成二进制数,再倒转,求倒转的二进制数对应的十进制数. 举例:123 -- 0000 0000 0000 0000 0000 0000 0000 0111 1011 --1101 1110 0000 0000 0000 0000 0000 0000 -- 3724541952 2.输出数字 题目描述:不同数字的输出形状如下: 黑色部分是1,白色部分是0. 输入:长度为1-20的字符串 输出:0和1组合的数字形状, 举例:输入:01 输出:

华科机考:字符串连接

输入描述: 每一行包括两个字符串,长度不超过100. 输出描述: 可能有多组测试数据,对于每组数据, 不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来. 输出连接后的字符串. 输入例子: abc def 输出例子: abcdef 要求:1.无冗余地接受两个字符串 2.无冗余的连接 显然像以前那样随便定义一个固定大小的数组是不行的(这是大一养成的恶习)o(╯□╰)o 当然用c++的string类,实现这两点非常简单. 代码: #include <iostream> u

和北邮的学生相比,差哪儿了

前言:在<写给考研学生:凭什么让好大学要你>中,有位大一的同学留言如下.三言两语说不清,对这个话题也想说几句,成此文 [留言] 老师,你好,我今年大一,准备考研考北邮,最近我也确实在思考一个问题:我与考北邮的同学究竟差在哪?我一个一本最低水平学校的学生考北邮有什么优势?您的文章解决了我问题的一部分,面对这个问题您还能再更具体的回答我吗?另外很多人说我们电子信息科学与技术专业比较杂,要选好方向,可是我都不知道方向有些什么,该怎么选?这里的"方向"具体指什么? [答复] 教育在

广联达北邮笔试题

广联达北邮宣讲笔试题 编程题 1.链表相比于数组不是其优点的是:存储空间小. 2.一群不同年龄的人,找出最小的年龄的差值(绝对值),时间复杂度小于O(n^2) 我的思路是:用快排将年龄排序(从小到大),然后用次小年龄减去最小年龄就是最小年龄差. 3.删除单向链表的给定的结点,时间复杂度为O(1) 链表结点定义: struct linknode{ int key; linknode * next } 剑指offer有此题. 思路:用给定结点的下一节点的值覆盖给定结点的值,然后将下一节点删除. 假设

记北邮创新展

第一次去北邮參观创新展.没想到,竟是如此惊喜. 近150种创新实践成果,同学们活跃的气氛,瞬间让你感受到创客应有的狂热状态. attachment_id=6223" rel="attachment wp-att-6223" style="margin:0px; padding:0px; border:0px; font-family:inherit; font-size:undefined; font-style:inherit; font-variant:inhe

北邮校赛 F. Gabriel&#39;s Pocket Money(树状数组)

F. Gabriel's Pocket Money 2017- BUPT Collegiate Programming Contest - sync 时间限制 2000 ms 内存限制 65536 KB 题目描述 For centuries, Heaven has required its young angels to live and study among humans in order to become full-fledged angels. This is no different

阿里巴巴安全部道哥、云舒3月10日在北邮讲座小记

PS:作为一个计算机行业安全研究人员,感觉到做学术不可与业界完全脱离,固特去北邮旁听,有些ideas很让人受启发! 附链接:http://bbs.byr.cn/#!article/Security/39553 ----------------------------------------------------------------------------------------- 阿里巴巴安全研究实验室负责人 云舒 进行密码破解的机器,通常自己的密码安全性都不高,用来攻击别人的方式,就是自

考研复试机试题(2010)

考研复试机试题(2010) 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 解答: /* * 描述: 机试题A解答 * 作者: 张亚超 * 博客: 牟尼的专栏 http://blog.csdn.net/u012027907 * 日期: 2014/7/21 */ #include "stdio.h" #define Max 1000 int getEveSum(int num){ //求各位的数字和 int sum = 0; while(num

大二《数据结构》机考解题报告

这次学校数据结构机考,题目很奇怪,简直让我觉得这是算法考试……三道题,撑死了用到树的遍历和并查集,连个队列都没用,也是醉了-.- 第一题 高精度加法  两个数相加,数最多5000位,也就是和最多5001位,而且连数的长度都会给.直接两个数组相加就好. 第二题 给出树的前序.中序遍历,要求写出树的后序遍历.  一棵树,若知道两种遍历,且其中一种是中序遍历,那么必然可以确定下这棵树,自然也可以求出第三种遍历.而这道题中,树最多有26个点(还是52个?记不清了),这就是告诉我们:你们随便搞吧,别进死循