1. 程式人生 > >劍指offer_面試題24_二叉搜尋樹的後序遍歷序列(遞迴)

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

題目:輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。

二叉搜尋樹規律:

1、若 左子樹 不空,則 左子樹上所有結點的值 均小於它的根結點的值。

2、若 右子樹 不空,則 右子樹上所有結點的值 均大於它的根結點的值。

3、左右子樹也分別為二叉搜尋樹。

舉例1:

輸入陣列:{5、7、6、9、11、10、8}

後序遍歷規律:左 - 右 - 根

5小於8====》5、7、6  左子樹    ===判斷是否都小於8====》是 ====遞迴====》5 左子樹;7 右子樹;6 根 ======》符合

9大於8====》9、11、10 右子樹  ===判斷是否都大於8====》是====遞迴=====》9 左子樹;11 右子樹;10 根======》符合

====》8  根

舉例2:

輸入陣列:{7,4,6,5}

====》5 根

====》7大於5,因此 7、4、6 ====》屬於右子樹 ===判斷是否都大於5==》否===》說明不是 二叉搜尋樹後序遍歷序列

演算法如下:

bool VerifySquenceofBST(int a[],int length)
{
    if(NULL == a || length <= 0)
        return false;

    int pRoot = length - 1;

/**二叉搜尋樹的四個規律*/
    /**1、在二叉搜尋樹中左子樹的結點小於於根結點*/
    int i = 0;
    while(i < length - 1)
    {
        if(a[i] > a[pRoot])
            break;
        i++;
    }

    /**2、在二叉搜尋樹中右子樹的結點大於根結點*/
    int j = i;
    while(j < length - 1)
    {
        if(a[j] < a[pRoot])
            return false;
        j++;
    }

    /**3、判斷左子樹是不是二叉搜尋樹*/
    bool left = true;
    if(i > 0)
        left = VerifySquenceofBST(a, i);

    /**4、判斷右子樹是不是二叉搜尋樹*/
    bool rigth = true;
    if(i < length - 1)
        rigth = VerifySquenceofBST(a + i, length - i - 1);

    return (left && rigth);
}

總結:

舉例項分析,有助理解

演算法 與 規律 相對應,分析過程,總結規律。

/* 點滴積累,我的一小步 */

相關推薦

offer_試題24_搜尋序列

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

Offer試題33搜尋序列java版

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

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

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

offer試題24 搜尋序列

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

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

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

offer23 搜尋序列java實現

題目 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 思路(遞迴) 後序遍歷,即根節點最後輸出。這是解題線索。 我們根據陣列最後一個數來遍歷整個陣列 比陣列小的是這

Offer-Python-搜尋的後續序列

題目:二叉搜尋樹的後續遍歷序列 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 思路:二叉搜尋樹的特點是,左子樹的值小於根節點的值,右子樹的值大於根節點的值。

--的非演算法

後續遍歷關鍵在於,當節點的  右子樹存在且被訪問後  或者是  右子樹為空  才能訪問自身。 在遍歷過程中,先將節點從的左孩子到最左節點壓棧, 設定標誌變數 flag 來判斷是否訪問過左孩子, pre指標來指向先前訪問過的節點。 所有左孩子壓棧後, 最後一個節點的左孩子為空,已被訪問p = NULL , 令f

的前、中和非

前言: 二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序、中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且程式碼很簡潔。而對於樹的遍歷若採用非遞迴的方法,就要採用

搜尋的後續序列

題目 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 程式碼 public boolean VerifySquenceOfBST(int [] sequence) {

搜尋C語言

  層序遍歷,寫完了,感慨下.   不同於前序遍歷,中序遍歷,後序遍歷,層序遍歷沒有使用棧模式,而是使用了佇列.   佇列中的資料,即QueueItem是二叉搜尋樹結點指標,這樣可以儲存結點,並且可以方便處理棧為空時返回值的問題.也就是可以返回NULL.   用一個函式實現,

offer試題25 中和為某一值的路徑

解題思路:首先需要理解路徑的概念:路徑總是從根節點到葉節點,由於路徑是從根節點開始,所以可以考慮用先序遍歷的方式。每遍歷完一個節點進入節點的左子樹時,需要將當前節點儲存起來,作為路徑中的一個節點,之所以需要儲存路徑上的節點,是因為需要計算路徑的和,是否和待查詢元素相同。因此

offer 試題25—中和為某一值的路徑

題目: 輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。 基本思想: 規律: 遍歷到某一節點時,將節點新增到路徑中,並累加該節點的值。如果該節點為葉節點並且路徑中節點值的和等於輸入整

offer試題25-中和韋某一值的路徑

question:給定一顆二叉樹,一個值。我們希望輸出和為該值的所有路徑。 假設樹的結構如下 思路:使用一個基於先序遍歷的遞迴過程來遍歷樹中每個點一次,每遍歷一個點就要獲得從根節點到被訪問的點的累加和,並儲存從根節點到當前點的路徑。然後進行判斷, case1如果當前點的左

offer--試題25:中和為某一值的路徑--Java實現

題目描述: 輸入一課二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 解題思路: 先模擬一下過程:樹的結構如下所示,期待路徑的和為22 10→5→4是一條路徑,它們的和不是22

offer》系列 搜尋序列Java

連結 牛客:二叉搜尋樹的後序遍歷序列 題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 思路 後序遍歷數字的順序小大中,這裡面的小和大其實是子樹的序列,中是單個數字,小

offer】Java實現-搜尋的第k個結點

題目描述 給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。 思路 二叉搜尋樹-BST(又二叉查詢樹,二叉排

offer{23-24}】搜尋序列中和為某一值的路徑

二叉搜尋樹的後序遍歷序列、二叉樹中和為某一值的路徑 二叉搜尋樹的後序遍歷序列 題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣

試題搜尋的中位數

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

offer-題63:搜尋的第k個結點

題目描述 給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。 實驗平臺:牛客網 解決思路: