2021秋招部分笔试题

2021秋招部分笔试题汇总 企业提供原题 00:00:28
4/6
[编程题]查找二叉搜索树的叶子节点
时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32M,其他语言64M

给一个二叉查找树(Binary Search Tree)的前序遍历结果数组,打印出所有的叶子节点。

输入描述:
输入为二叉查找树的前序遍历结果数组,元素之间用空格分隔:

9 8 7 10

输出描述:
所有的叶子节点元素,用空格分隔

解释:因为二叉搜索树的表示为:

   9

8 10

7

输出的叶子节点为: 7 10

输入例子1:
9 8 7 10

输出例子1:
7 10

1.首先我们要知道什么是二叉查找树,就是每一个节点的左子树都要小于它,它的右子树都要大于它。

又因为是前序遍历的顺序。我们知道第一个点肯定是根节点,那么我们就找数组里面第一个大于它的元素,第一个大于它的点的右边就是它的右子树,而从它开始到第一个大于它的节点部分就是它的左子树,我们递归的遍历遍历这个过程,当左边界等于右边界时,代表当前元素已经没有孩子了,直接输出这个结点即可。注意一下边界情况即可。`

#include <vector>
#include <string>
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int a[maxn];
int findindex(int start, int ed ,int target)//找第一个大于它的数
 {
    int i;
    for (i = start; i <= ed; i++) {
        if (a[i] > target) return i;
    }
    return i;
}

void dfs(int start, int en) {

    if (start > en) return;
  if (start == en) //没有左右子树
  {
        cout << a[start] << " ";
        return;
    }

        int index = findindex(start+1, en, a[start]);
        if (index <= en) //说明当前结点有左子树和右子树需要分别遍历其左右子树,因为是前序,所以每一个start都是根结点,或者叶子结点
        {
            dfs(start+1, index-1 );
            dfs(index, en );
        }
        else//说明只有左子树,只需要遍历左子树即可
         {
            dfs(start+1, index-1);
        }
}
int main() {

   char c;
   int i=0;
   do{
  scanf("%d",&a[i++]);
     scanf("%c", &c);
   }while(c==' ');
  // cout<<i<<endl;
   dfs(0,i-1);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值