//描述:輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷。
// 如果是,則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。
//1-樣例輸入:5 7 6 9 11 10 8
//1-樣例輸出:yes
//2-樣例輸入:7 4 6 5
//2-樣例輸出:no
首先要知道二叉搜尋樹的定義:
或者是一棵空樹,或者具有以下性質的二叉樹:
1) 若它的左子樹不空,則左子樹所有節點的值均小於它的根節點的值;
2)若它的右子樹不空,則右子樹所有節點的值均大於它的根節點的值;
3)它的左右子樹也分別為二叉排序樹。
後序遍歷的定義為:
l–>r–>n
滿足後序遍歷的二叉搜尋樹 數列可以分為三段:
小於根、大於根,根
分別對應的左、右子樹又滿足上述規律。適用於遞迴演算法
演算法:
找到左右子樹的分界點,再繼續遞迴判斷,直到不滿足條件或者判斷完成退出。
**:
if (low>=high)
return
1; //空的二叉樹或者只有根
for (i=low;dat[i]//判斷左子樹終點 大於i的部分除了根節點,為右子樹
high1=i;
while(iif (dat[i]//右子樹部分要都大於根節點才滿足條件
return
0; i++; //右子樹滿足條件,繼續判斷
}flag=jude_afterbinarytree(dat,1,high1-1); //判斷左子樹
if (flag)
flag=jude_afterbinarytree(dat,high1,high-1); //判斷右子樹
return flag;
其中low和high表示每次遞迴時,陣列判斷的開始與結束位置;high1記錄了判斷中途左右子樹的分界點;
root為根節點的大小
程式執行結果:
2015/10/26 程式改進:
if (low>=high)
return
1; //只有根
else{
int i,j;
for (i=low;i//判斷左子樹終點 大於i的部分除了根節點,為右子樹
if (dat[i]>=dat[high])
break;
for (j=i;jif (dat[j]return
0; return jude_afterbinarytree(low,i-1)*jude_afterbinarytree(i,high-1);
二叉搜尋樹的後序遍歷
二叉搜尋樹的後序遍歷序列中,最後乙個值是根結點,前面比根節點小的是左結點,後面比根結點大的是右結點。include include bool verifysquenceofbst int sequence,int length int root sequence length 1 int i 0 在...
二叉搜尋樹的後序遍歷
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路採用遞迴方法 include include includeusing namespace std bool core vectorsequence,int ...
二叉搜尋樹的後序遍歷
題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。二叉搜尋樹定義 二叉查詢樹 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空...