1. 程式人生 > >面試題之二叉搜尋樹的中位數

面試題之二叉搜尋樹的中位數

Given a BST (Binary search Tree) how will you find median in that?
 
Constraints:
 
* No extra memory.
* Function should be reentrant (No static, global variables allowed.)
* Median for even no of nodes will be the average of 2 middle elements and for odd no of terms will be middle element only.
* Algorithm should be efficient in terms of complexity. 

中文不需要贅述了,就是二叉搜尋樹如何高效地找到中位數,不希望申請記憶體,不要static/global的變數來實現。

第一反應就是中序遍歷就是排序了,但是如果要計數的話,我們需要一個額外的變數,這樣恐怕需要或是靜態或者全域性變量了,故不可以用。但是我們其他很多次都碰到了那樣類似的問題,如何把一個二叉樹原地轉化成雙向連結串列,那時候還有點覺得題目沒意思,沒啥用處。但是在這裡,作用得以體現。假如有形如

                                            10
                                          /    /
                                        6       14
                                      /  /     /  /
                                    4     8  12    16

的二叉樹轉化成了4=6=8=10=12=14=16這樣一個雙鏈表,那後面的問題就變成了如何在4=6=8=10=12=14=16裡面找到中間節點了,這對於我們習慣了2個快慢指標追趕的小朋友來說不算問題了。

下面就是寫的一個實現:

說實話這樣的題目還是比較喜歡的,考到了很多的概念和想法,

a.中序遍歷

b.BST轉化成DLL

c.尋找連結串列的中間節點

如果任何一個問題割裂開了問, 都是比較容易解決的。困難就在於如何用已知的辦法組合地解決未知的問題,發人深思,餘是以記之。

相關推薦

試題搜尋位數

Given a BST (Binary search Tree) how will you find median in that?   Constraints:   * No extra memory. * Function should be reen

劍指Offer試題33搜尋的後序遍歷序列java版

題目:輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 分析:在後序遍歷序列中,最後一個數字是樹的根節點的值。陣列中前面的數字可以分為兩部分:第一部分是左子樹節點的值,它

劍指offer--試題27:搜尋與雙向連結串列--Java實現

題目描述: 輸入一顆二叉搜尋樹,將二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 思路: 原先指向左子結點的指標調整為連結串列中指向前一個結點的指標,原先指向右子結點的指標指向為連結串列中指向後一個結點的指標

劍指offer試題24 搜尋的後序遍歷序列

解題思路: 1.判定一個序列是不是某二叉搜尋樹的後續遍歷序列,可以結合二叉樹的後續序列和二叉搜尋樹的特點來判斷。二叉樹的後續遍歷序列,其最後一個數字是樹的根節點的值,根節點的前面部分可以分為左子樹的序列和右子樹的序列。而這顆二叉樹需要是一顆二叉搜尋樹,又必須滿足左子樹上的所

劍指offer_試題24_搜尋的後序遍歷序列(遞迴)

題目:輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。 二叉搜尋樹規律: 1、若 左子樹 不空,則 左子樹上所有結點的值 均小於它的根結點的值。 2、若 右子樹 不空,則 右子

劍指offer-試題63-搜尋的第k個結點

二叉樹節點定義: package case63_KthNodeOfBST; /** * 二叉搜尋樹的結點結構定義 * * @author WangSai * */ public class MyNode { int data; MyNode lchild;

試題的遍歷方式

一、基本概念 1、二叉樹的概念 一棵二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根節點加上兩棵分別稱為左子樹和右子樹的二叉樹組成(即一個根節點最多隻有兩個孩子結點)。 2、二叉樹的特點 (1)每個結點最多有兩棵子樹,即二叉樹不存在度大於2的結

百度試題層次遍歷(從上到下,從下到上)

1.二叉樹的層次遍歷 遞迴解法 class Node(object): def __init__(self, v, left=None, right=None): self.value = v self.left = l

前端常見算法試題 - 維數組的查找[JavaScript解法]

java art tail asc 特殊 不用 === ++ blog --------------------- 作者:吳瀟雄 來源:CSDN 原文:https://blog.csdn.net/weixin_43439741/article/details/8351184

700,搜尋搜尋

給定二叉搜尋樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。 例如, 給定二叉搜尋樹: 4 / \ 2 7 / \ 1 3 和值:

[LeetCode] Search in a Binary Search Tree 搜尋搜索

  Given the root node of a binary search tree (BST) and a value. You need to find the node in the BST that the node's value equals the given value. R

Leetcode501.Find Mode in Binary Search Tree搜尋的眾數

給定一個有相同值的二叉搜尋樹(BST),找出 BST 中的所有眾數(出現頻率最高的元素)。 假定 BST 有如下定義: 結點左子樹中所含結點的值小於等於當前結點的值 結點右子樹中所含結點的值大於等於當前結點的值 左子樹和右子樹都是二叉搜尋樹 例如: 給定 B

leetcode 700. 搜尋搜尋(python)

給定二叉搜尋樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。 例如, 給定二叉搜尋樹: 4 / \ 2 7 / \ 1 3 和值:

LeetCode-230 kth smallest element in a bst 搜尋第K小的元素

題目連結 https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/ 題意 中文題,對於二叉搜尋樹而言,找其中的第K小的數 題解         很有趣的題,但是很簡單

[leetcode]270. Closest Binary Search Tree Value搜尋找target的最接近值

Given a non-empty binary search tree and a target value, find the value in the BST that is closest to the target. Note: Given target

Leetcode700.Search in a Binary Search Tree搜尋搜尋

給定二叉搜尋樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。     class Solution { public: TreeNode* searchBST(

leet230. 搜尋第K小的元素

題目: 給定一個二叉搜尋樹,編寫一個函式kthSmallest來查詢其中第k個最小的元素。 注意:你可以假設k總是有效的,1≤ k ≤二叉搜尋樹元素個數。 進階:如果經常修改二叉搜尋樹(插入/刪除操作)並且你需要頻繁地找到第k小值呢? 你將如何優化kthSmallest函式? 分析:

LeetCode 700——搜尋搜尋

1. 題目 2. 解答 如果根節點為空,直接返回 NULL。如果根節點非空,從根節點開始迴圈查詢,直到節點為空。 如果待查詢的值大於當前節點值,節點指向右孩子; 如果待查詢的值小於當前節點值,節點指向左孩子; 如果待查詢的值等於當前節點值,返回當前節點。 若迴圈結束還沒有找到,返

搜尋序迭代器的實現

#include<iostream>#include<queue>#include<stack>#include<stdlib.h>using namespace std; struct Location{ int xindent,ylevel;};void

leetcode700--搜尋搜尋----

給定二叉搜尋樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。 例如, # Definition for a binary tree node. # class TreeNode: #