`
mengxianming
  • 浏览: 2156 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

面试题目试解:int数组里找二叉排序树root结点

阅读更多
网上看到的面试题目。

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

分享到:
评论

相关推荐

    Java实现二叉排序树

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉排序树中,对于...

    二叉排序树的C语言实现

    二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种性质使得...

    二叉排序树C++

    遍历可以帮助我们打印树的所有节点或进行其他操作,如构建排序数组。 6. **平衡问题**:虽然二叉排序树在理想情况下性能优异,但如果插入的数据顺序不理想,可能导致树严重倾斜,从而降低查找效率。为了解决这个...

    vc++二叉排序树的程序

    二叉排序树(Binary Search Tree,BST),又称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在计算机科学中扮演着重要角色,特别是在数据检索、排序和组织方面。VC++是Microsoft开发的一款集成开发...

    二叉排序树与文件操作

    【二叉排序树与文件操作】 功能要求: (1)从键盘输入一组学生记录建立二叉排序树; (2)二叉排序树存盘; (3)由文件恢复内存的二叉排序树; (4)中序遍历二叉排序树; (5)求二叉排序树深度; (6)求二叉...

    二叉排序树

    二叉排序树,又称二叉查找树或二叉有序树,是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种性质使得...

    数据结构课程设计二叉排序树的实现

    ### 数据结构课程设计二叉排序树的实现 #### 一、二叉排序树的基本概念 二叉排序树(Binary Search Tree, BST),又称二叉查找树或有序二叉树,是一种特殊的二叉树,其特点在于对于任意节点而言,其左子树中的所有...

    算法笔记,将有序数组转为二叉搜索树

    将有序数组转换为二叉搜索树 本文将详细解释如何将有序数组转换为二叉搜索树,包括问题描述、解题思路、Java 和 Python 实现代码以及时间和空间复杂度分析。 问题描述 给定一个整数数组 nums,其中元素已经按升序...

    二叉排序树 平均查找长度的操作

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值,且满足以下性质:对于任意节点,其左子树中的所有节点的键值都小于该节点的键值,而右子树中的...

    C/C++:二叉排序树.rar(含完整注释)

    设二叉排序树的二叉链表存储结构的类型定义如下: typedef struct node{ int data; //用整数表示一个结点的名 struct node *LChild,*RChild; //左右指针域 }BSTNode,*BSTree; 设计算法并编写程序求解以下几个问题...

    查找二叉排序树的双亲节点,并输出路径project

    在IT领域,二叉排序树(Binary Sort Tree,BST)是一种常见的数据结构,它具有左子树小于根节点、右子树大于根节点的特性,从而保证了树的有序性。这种特性使得二叉排序树在查找、插入和删除操作上具有较高的效率。...

    构造二叉排序树

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都满足以下两个性质: 1. 左子树上的所有节点的值均小于该节点的值。 2. 右子树上的所有节点的值均...

    数据结构 二叉排序树 java图形界面实现

    二叉排序树(Binary Sort Tree,也称为二叉搜索树),是数据结构中的一种特殊类型树,它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。...

    C语言实现二叉排序树生成算法

    根据给定的信息,本文将详细解释如何使用C语言实现二叉排序树的生成算法,并重点关注平衡二叉排序树的创建及遍历。 ### 一、二叉排序树基础概念 在深入了解具体的C语言代码实现之前,我们先来回顾一下二叉排序树...

    二叉排序树的基本操作

    ### 二叉排序树的基本操作解析 #### 一、二叉排序树简介 二叉排序树(Binary Search Tree,简称BST)是一种特殊的二叉树结构,它的每个节点包含一个键值(Key)以及两个指向其左右子树的指针。在二叉排序树中,...

    二叉排序树查找算法

    二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特点是:对于任意节点,其左子树中的所有...

Global site tag (gtag.js) - Google Analytics