网上看到的面试题目。
93.在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
直观想法是用两个数组a、b。a[i]、b[i]分别保存从前到i的最大的数和从后到i的最小的数,
一个解答:这需要两次遍历,然后再遍历一次原数组,
将所有data[i]>=a[i-1]&&data[i]<=b[i]的data[i]找出即可。
给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一次。
下面是试解,当做是抛砖引玉吧。
package javabasic;
import java.util.Arrays;
import java.util.Random;
public class FindBinTreeRoot {
/**
* 在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
* 这里把数组元素看做是二叉排序树的结点,找出能作为root结点的元素。
* 例如:[4,2,3,5,7,4,8,9],则8或9都可以作为root结点。
* @param arr
* @return 目标元素的索引
*/
public static int find( int[] arr ) {
// init the left max element to MIN. So any element >= it
int lMax = Integer.MIN_VALUE;
for ( int i = 0; i < arr.length; i++ ) {
int cur = arr[i];
if ( cur >= lMax ) {
// update the left max element
lMax = cur;
boolean rightOK = true;
// check if the right elements >= the current element
for ( int j = i + 1; j < arr.length; j++ ) {
// update the left max element
if ( arr[j] >= lMax ) {
lMax = arr[j];
}
if ( arr[j] < cur ) {
// There is a right element < the current element,
// so no element before index j is the possible answer.
rightOK = false;
// Elements after j are possible, so set current element to j
i = j;
break;
}
}
if ( rightOK ) {
// right the target element index
return i;
}
}
}
return -1;
}
/**
* @param args
*/
public static void main( String[] args ) {
// int[] arr = new int[]{4,2,3,5,7,4,8,9};
//随机产生一个20个元素的数组
int[] arr = new int[20];
Random ran = new Random();
int target = ran.nextInt(arr.length);
arr[target] = 10;
for(int i=0;i<target;i++){
//left half <10
arr[i] = ran.nextInt( 10 );
}
for(int i=target + 1;i<arr.length;i++){
//right half > 10
arr[i] = ran.nextInt( 10 ) + 10;
}
System.out.println(Arrays.toString(arr));
System.out.println("target index=" + target);
System.out.println("result index=" + FindBinTreeRoot.find( arr ));
}
}
测试运行结果:
[6, 3, 7, 9, 3, 5, 9, 4, 5, 0, 1, 1, 2, 1, 3, 0, 1, 9, 10, 19]
target index=18
result index=17
分享到:
相关推荐
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉排序树中,对于...
二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种性质使得...
遍历可以帮助我们打印树的所有节点或进行其他操作,如构建排序数组。 6. **平衡问题**:虽然二叉排序树在理想情况下性能优异,但如果插入的数据顺序不理想,可能导致树严重倾斜,从而降低查找效率。为了解决这个...
二叉排序树(Binary Search Tree,BST),又称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在计算机科学中扮演着重要角色,特别是在数据检索、排序和组织方面。VC++是Microsoft开发的一款集成开发...
【二叉排序树与文件操作】 功能要求: (1)从键盘输入一组学生记录建立二叉排序树; (2)二叉排序树存盘; (3)由文件恢复内存的二叉排序树; (4)中序遍历二叉排序树; (5)求二叉排序树深度; (6)求二叉...
二叉排序树,又称二叉查找树或二叉有序树,是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种性质使得...
### 数据结构课程设计二叉排序树的实现 #### 一、二叉排序树的基本概念 二叉排序树(Binary Search Tree, BST),又称二叉查找树或有序二叉树,是一种特殊的二叉树,其特点在于对于任意节点而言,其左子树中的所有...
将有序数组转换为二叉搜索树 本文将详细解释如何将有序数组转换为二叉搜索树,包括问题描述、解题思路、Java 和 Python 实现代码以及时间和空间复杂度分析。 问题描述 给定一个整数数组 nums,其中元素已经按升序...
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值,且满足以下性质:对于任意节点,其左子树中的所有节点的键值都小于该节点的键值,而右子树中的...
设二叉排序树的二叉链表存储结构的类型定义如下: typedef struct node{ int data; //用整数表示一个结点的名 struct node *LChild,*RChild; //左右指针域 }BSTNode,*BSTree; 设计算法并编写程序求解以下几个问题...
在IT领域,二叉排序树(Binary Sort Tree,BST)是一种常见的数据结构,它具有左子树小于根节点、右子树大于根节点的特性,从而保证了树的有序性。这种特性使得二叉排序树在查找、插入和删除操作上具有较高的效率。...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都满足以下两个性质: 1. 左子树上的所有节点的值均小于该节点的值。 2. 右子树上的所有节点的值均...
二叉排序树(Binary Sort Tree,也称为二叉搜索树),是数据结构中的一种特殊类型树,它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。...
根据给定的信息,本文将详细解释如何使用C语言实现二叉排序树的生成算法,并重点关注平衡二叉排序树的创建及遍历。 ### 一、二叉排序树基础概念 在深入了解具体的C语言代码实现之前,我们先来回顾一下二叉排序树...
### 二叉排序树的基本操作解析 #### 一、二叉排序树简介 二叉排序树(Binary Search Tree,简称BST)是一种特殊的二叉树结构,它的每个节点包含一个键值(Key)以及两个指向其左右子树的指针。在二叉排序树中,...
二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特点是:对于任意节点,其左子树中的所有...