劍指Offer 23 二叉搜尋樹的後序遍歷序列

2021-10-04 00:17:45 字數 1555 閱讀 6157

題目描述

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。

題解一:遞迴

後序遍歷序列的最後乙個元素為二叉樹的根節點;

二叉搜尋樹左子樹上所有的結點均小於根結點、右子樹所有的結點均大於根

1

public

static

boolean verifysquenceofbst(int

sequence)

5if(sequence.length==1)

8return judge(sequence,0,sequence.length-1);9}

10public

static

boolean judge(int arr,int start,int

end )

14int i =start;

15//

找到左右支樹臨界點,即右支樹的第乙個節點索引為i

16while (arr[i] 19//

若右支樹節點小於根節點,則false

20for (int j = i; j < end; j++) 24}

25//

左右支樹均符合才true

26return judge(arr, 0, i - 1) && judge(arr, i, end - 1);

27 }

題解二:棧的壓入、彈出序列

討論區大佬寫這道題的例子時發現二叉樹的中序序列和後序序列就滿足棧的壓入彈出序列關係。即如果把中序序列當做棧的壓入序列,那麼後序序列是該棧的乙個彈出序列。 而bst的中序是排序陣列。因此將本題的序列排序作為中序序列,引用「棧的壓入、彈出序列」題的答案判斷兩序列是否滿足上述關係即可

1

public

static

boolean verifysquenceofbst01(int

sequence)

6public

static

boolean ispoporder(int pusha,int

popa)

10int popindex=0;

11 stackstack = new stack<>();

12for(int i=0;i)18}

19return

stack.isempty();

20 }

測試:

1

public

static

void

main(string args)

10system.out.println(arrays.tostring(number));

11boolean b =verifysquenceofbst(number);

12system.out.println(b);13}

14輸入:

15 4

16 7 4 6 5

17輸出:

18 [7, 4, 6, 5]

19false

劍指offer 23 二叉搜尋樹的後續遍歷

程式設計資料獲取 codelab 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。我們先來了解一下什麼是二叉搜尋樹 二叉查詢樹 binarysearchtree 也稱為二叉搜尋樹 有序二叉樹或排序二叉樹是指一棵...

劍指offer 23 二叉搜尋樹的後序遍歷序列

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同 二叉搜尋樹的性質 根節點大於左子樹所有元素,小於右子數的所有元素。那麼後序遍歷的話,最後乙個元素就為根節點root。那麼本題的思路如下 找到陣列中左右子樹的分界點...

劍指offer 23二叉搜尋樹的後序遍歷序列

題目描述 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。分析 後續遍歷要求左子樹大於根大於右子樹,陣列最後乙個元素為根。陣列前半段小於最後乙個元素,為左子樹 後半段大於最後乙個元素,為右子樹,否則返回fals...