【剑指Offer】23、二叉搜索树的后序遍历序列
??題目描述:
??輸入一個(gè)整數(shù)數(shù)組,判斷該數(shù)組是不是某二叉搜索樹的后序遍歷的結(jié)果。如果是則輸出Yes,否則輸出No。假設(shè)輸入的數(shù)組的任意兩個(gè)數(shù)字都互不相同。
??解題思路:
??對(duì)于后續(xù)遍歷序列,序列的最后一個(gè)值一定是樹的根結(jié)點(diǎn),而由二叉搜索樹的性質(zhì):左小右大,我們可以從頭開始遍歷,當(dāng)遍歷到某個(gè)值比根結(jié)點(diǎn)大時(shí)停止,記為flag,此時(shí)flag之前的所有數(shù)值都是二叉搜索樹的左子樹的結(jié)點(diǎn),flag以及flag之后的所有數(shù)都是二叉搜索樹的右子樹的結(jié)點(diǎn)。這是由二叉搜索樹以及后序遍歷共同決定的。
??接下來,我們就可以把任務(wù)交給遞歸,同樣的方法去判斷左子樹和右子樹是否是二叉搜索樹,這顯然是典型的遞歸解法。
??舉例:
??以{5,7,6,9,11,10,8}為例,后序遍歷結(jié)果的最后一個(gè)數(shù)字8就是根結(jié)點(diǎn)的值。在這個(gè)數(shù)組中,前3個(gè)數(shù)字5、7和6都比8小,是值為8的結(jié)點(diǎn)的左子樹結(jié)點(diǎn);后3個(gè)數(shù)字9、11和10都比8大,是值為8的結(jié)點(diǎn)的右子樹結(jié)點(diǎn)。
??我們接下來用同樣的方法確定與數(shù)組每一部分對(duì)應(yīng)的子樹的結(jié)構(gòu)。這其實(shí)就是一個(gè)遞歸的過程。對(duì)于序列5、7、6,最后一個(gè)數(shù)字6是左子樹的根結(jié)點(diǎn)的值。數(shù)字5比6小,是值為6的結(jié)點(diǎn)的左子結(jié)點(diǎn),而7則是它的右子結(jié)點(diǎn)。同樣,在序列9、11、10中,最后一個(gè)數(shù)字10是右子樹的根結(jié)點(diǎn),數(shù)字9比10小,是值為10的結(jié)點(diǎn)的左子結(jié)點(diǎn),而11則是它的右子結(jié)點(diǎn),所以它對(duì)應(yīng)的二叉搜索樹如下:
??編程實(shí)現(xiàn)(Java):
public class Solution {public boolean VerifySquenceOfBST(int [] sequence) {if(sequence==null||sequence.length==0)return false;return VerifySquenceOfBST(sequence,0,sequence.length-1);}public boolean VerifySquenceOfBST(int [] sequence,int begin,int end){if(end<=begin) //結(jié)束條件return true;//end為根節(jié)點(diǎn),找左右子樹的分界int i=begin;for(;i<end;i++) //找邊界,并同時(shí)判斷了左子樹都小于根if(sequence[i]>sequence[end])break;for(int j=i+1;j<end;j++) //右子樹如果存在小于根的,則不是二叉搜索樹if(sequence[j]<sequence[end])return false;return VerifySquenceOfBST(sequence,begin,i-1) && VerifySquenceOfBST(sequence,i,end-1);}
}
轉(zhuǎn)載于:https://www.cnblogs.com/gzshan/p/10796115.html
總結(jié)
以上是生活随笔為你收集整理的【剑指Offer】23、二叉搜索树的后序遍历序列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nike回到未来2多少钱
- 下一篇: HDU - 2181-哈密顿绕行世界问题