1. 程式人生 > >面試19之建立一顆高度最小的二叉搜尋樹

面試19之建立一顆高度最小的二叉搜尋樹

題目描述
對於一個元素各不相同且按升序排列的有序序列,請編寫一個演算法,建立一棵高度最小的二叉查詢樹。

給定一個有序序列int[] vals,請返回建立的二叉查詢樹的高度。

注意:這只是求高度最小的二叉查詢樹,不是真的要構建一顆樹,完全二叉樹的高度最小。為log2^n + 1

//第一種方式,二分法,非遞迴寫法。

int BuildMinimalBST(vector<int> vals)
{

	int left = 0;
	int right = vals.size()-1;
	int count = 0;
	while(left <= right)
	{

		count++;
		int mid = left+( (right-left) >> 1);
		
		if(mid-left < right-mid) //左區間中的元素小於右區間中的元素。
		{
			left = mid + 1;
		}
		else  //左區間中的元素個數大於右區間中的元素個數。
		{
			right = mid - 1;
		}

	}

	return count;
}

//第二種方式:遞迴寫法。

int CreateMinBST(int start,int end)
{
	if(start > end)
		return 0;

	int mid = start+( (end - start) >> 1);
	int  left = CreateMinBST(start,mid-1);
	int  right = CreateMinBST(mid+1,end);
	return left > right ? left+1 : right+1;

}

int BuildMinimalBST(vector<int> vals)
{

	return CreateMinBST(0,vals.size()-1);

}



相關推薦

面試19建立高度搜尋

題目描述 對於一個元素各不相同且按升序排列的有序序列,請編寫一個演算法,建立一棵高度最小的二叉查詢樹。給定一個有序序列int[] vals,請返回建立的二叉查詢樹的高度。 注意:這只是求高度最小的二叉查詢樹,不是真的要構建一顆樹,完全二叉樹的高度最小。為log2^n +

[CareerCup] 4.3 Create Minimal Binary Search Tree 建立搜尋

4.3 Given a sorted (increasing order) array with unique integer elements, write an algorithm to create a binary search tree with minimal height. 這道題給了

資料結構:由有序數列建立高度排序與判斷 個序列是否為該排序中的一個合法查詢序列

編寫一個程式,對於給定的一個有序的關鍵字序列,建立一棵高度最小的二叉排序樹。並判斷一個序列是否為該二叉排序樹中的一個合法的查詢序列 #include<stdio.h> #include<stdlib.h> typedef struct node

建立查詢

struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x):val(x),left(NULL),right(NULL){} }; TreeNode *createBST(vector<int> arr,in

《演算法導論》搜尋

最優二叉搜尋樹 假定我們正在設計一個程式,實現英語文字到法語的翻譯。對英語文字中出現的每個單詞,我們需要查詢對應的法語單詞。為了實現這些查詢操作,可以建立一棵二叉搜尋樹,將n個英語單詞作為關鍵字,對應的法語單詞作為關聯資料。由於文字中的每個單詞都要進行搜尋,我們

搜尋(JAVA實現)

演算法課上老師講的最優二叉搜尋樹,自己又查了些資料才看明白。這篇只記錄下自己用java的實現和自己的一些細節的理解。想學習整個演算法的可以參照 https://blog.csdn.net/zhangyifei521/article/details/50833792 package bes

搜尋探究【C/C++】

簡述 什麼是二叉樹 下面的這棵樹,就是二叉搜尋樹 相對於什麼最優 這裡考慮的是ASL(average search length)平均搜尋長度。即根據概率來生成ASL最小的搜尋樹。 到這裡,最優二叉

15.5 搜尋

背景 假定我們正在設計一個程式,實現英語文字到中文的翻譯。對英語文字中出現的每個單詞,我們需要查詢對應的中文。為了實現這些操作,我們可以建立一個二叉搜尋樹,將n個英語單詞作為關鍵字,對應的中文作為關聯資料。 #定義 給定一個n個不同關鍵字的已排序的序列K=<

Leetcode題解連結串列(2)驗證搜尋

題目描述: 給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。 假設一個二叉搜尋樹具有如下特徵: 節點的左子樹只包含小於當前節點的數。 節點的右子樹只包含大於當前節點的數。 所有左子樹和右子樹自身必須也是二叉搜尋樹。 示例 1: 輸入: 2 /

AVL高度平衡的搜尋)平衡因子的調節和旋轉

1.什麼叫AVL樹?                    AVL樹又稱為高度平衡的二叉搜尋樹,它能保持二叉樹的高度平衡,儘量降低二叉樹的高度,減少樹的平均搜尋長度(儘量使這棵樹保持為完全二叉樹,這樣

0020演算法筆記——【動態規劃】搜尋問題

 1、問題描速: 設 S={x1, x2, ···, xn} 是一個有序集合,且x1, x2, ···, xn表示有序集合的二叉搜尋樹利用二叉樹的頂點儲存有序集中的元素,而且具有性質:儲存於每個頂點中的元素x 大於其左子樹中任一個頂點中儲存的元素,小於其右子

演算法導論第十五章15.5-2構造搜尋

#include "StdAfx.h" #include <iostream> #include <vector> using namespace std; void optimal_bst(vector<double>&

搜尋 的C++實現

#include<iostream> using namespace std; void OptimalBST(float*p_Node,float*p_NonNode, float m [6][6],float w[6][6],float s[6][6],int

演算法導論程式39--搜尋(Python)

最優二叉搜尋樹: 給定一個n個不同關鍵字的已排序的序列K=<k1,k2,...,kn>(因此k1<k2<...<kn)我們希望用這些關鍵字構造一棵二叉樹。對每個關鍵字ki,都有一個概率pi表示其搜尋頻率。 有些要搜尋的值可能不在K中,因此,我們

機器學習筆記():乘法和梯度下降

一、最小二乘法 1.一元線性擬合的最小二乘法 先選取最為簡單的一元線性函式擬合助於我們理解最小二乘法的原理。 要讓一條直接最好的擬合紅色的資料點,那麼我們希望每個點到直線的殘差都最小。 設擬合直線為

搜尋節點絕對值差/在查詢中尋找兩個節點,使它們的和為一個給定值/找出 BST 中的所有眾數(出現頻率最高的元素)。

關於二叉樹的數值運算,一般考慮借用中序遍歷為陣列;再進行計算的思想。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *

動態規劃法長公共子串和查詢

1. 筆試常考的題型,最長公共子串問題:給定兩個字串str1和str2,返回兩個字串的最長公共子串(連續)和長度。 舉例: str1 = "abc" str2="caba" 它們的最長公共子串是 "ab"。 此題可用暴力法進行求解,求解的時間複雜度較高。現用動態規劃法進

第十五章動態規劃查詢

本書從文字翻譯的案例切入,假設把英文翻譯為法文,每個英文單詞為關鍵字,其對應法文為衛星資料。用二叉查詢樹儲存,該怎麼設計這個查詢樹。即使是紅黑樹,查詢的時間複雜度也為O(lgn)即樹的深度。但是因為文章中某個單詞出現的頻率不同,所以可能有些頻率很高的單詞比如the的深度可能

java 輸入搜尋,將該搜尋轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整中結點指標的指向。

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 比如將二元查詢樹                       

判斷是否為搜尋

首先定義一個二叉樹的結構體 struct BinaryTree { int value; BinaryTree* lson; BinaryTree* rson; }; 第一種方法 int maxOf(BinaryTree* root) { i