判斷整數序列是不是二元查詢樹的後序遍歷結果

2022-02-25 17:06:55 字數 1534 閱讀 4236

題目:輸入乙個整數陣列,判斷該陣列是不是某二元查詢樹的後序遍歷的結果。

如果是返回true,否則返回false。

例如輸入5、7、6、9、11、10、8,由於這一整數序列是如下樹的後序遍歷結果.

8/ \

6   10

/ \  / \

5  7 9 11

因此返回true。

如果輸入7、4、6、5,沒有哪棵樹的後序遍歷的結果是這個序列,因此返回false。

解:    後序遍歷的最後乙個節點一定是根節點,從右往左倒著遍歷一邊這個序列即可得到結果。具體過程為:

假設序列儲存在陣列a中

1.  先建立乙個區間 (負無窮,正無窮),   令i=1,為序列從右邊數的第 i 個節點。   

2.  判斷a[i] 是否在區間中。

例如當i=1時,根節點8被加入區間,原區間被分成兩個區間(負無窮,8),(8,正無窮),i的左子

樹中的點必然落在第乙個區間,i的右子樹中的點必然在第二個區間中

然後取出第二個節點10,加入第二個區間,此時區間被分成了3個

(負無窮,8),(8,10),(10,正無窮)

然後取第3個節點11,得到4個區間

(負無窮,8),(8,10),(10,11)(11,正無窮)

然後取第4個節點9,顯然9應放進第二個區間,捨掉後兩個個區間(如果是合法的序列,序列前面不可能有

落在後面區間中的點),得到:

(負無窮,8),(8,9),(9,10)

如此下去,如果序列中每個點都可以插到棧中,那麼陣列是二元查詢樹的後序遍歷的結果,否則返回false.

#include 

<

iostream

>

#include

<

climits

>

using

namespace

std;

#define

n 100

bool

judge(

inta,

intlen)

;int

top=1;

//棧頂指標

for(

inti

=len-1

; i>=0;

--i)

if(a[i]

==stk[top])

//如果啊a[i]與棧中元素相同返回false

return

false;//

把棧中比a[i]大的那個數向右移乙個位置,把a[i]插到棧中

top +=2

;

stk[top]

=stk[top-1

];stk[top-1

] =a[i];

}return

true;}

intmain();//

int a=;

cout

<<

judge(a,7)

<<

endl ;

}

判斷整數序列是不是二元查詢樹的後序遍歷結果

二叉查詢樹 binary search tree 或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。post order 先訪問左節點,再訪問右節點...

判斷整數序列是不是二元查詢樹的後序遍歷結果

第9題 判斷整數序列是不是二元查詢樹的後序遍歷結果 題目 輸入乙個整數陣列,判斷該陣列是不是某二元查詢樹的後序遍歷的結果。如果是返回true,否則返回false。例如輸入5 7 6 9 11 10 8,由於這一整數序列是如下樹的後序遍歷結果 8 6 10 5 7 9 11 因此返回true。如果輸入...

判斷整數序列是不是二元查詢樹的後序遍歷結果

二叉樹 遍歷 一 題目 感謝 提供的題目 判斷整數序列是不是二元查詢樹的後序遍歷結果 輸入乙個整數陣列,判斷該陣列是不是某二元查詢樹的後序遍歷的結果。如果是返回true,否則返回false。例如 輸入5 7 6 9 11 10 8,由於這一整數序列是如下樹的後序遍歷結果 8 6 10 5 7 9 1...