C#刷剑指Offer | 二叉搜索树的后序遍历序列
【C#刷題】|?作者?/ Edison Zhou
這是EdisonTalk的第289篇原創(chuàng)內(nèi)容
我們來(lái)用之前學(xué)到的數(shù)據(jù)結(jié)構(gòu)知識(shí)來(lái)刷《劍指Offer》的一些核心題目(精選了其中30+道題目),希望對(duì)你有幫助!本文題目為:二叉搜索樹的后序遍歷序列。
1題目介紹
題目:輸入一個(gè)整數(shù)數(shù)組,判斷該數(shù)組是不是某二叉搜索樹的后序遍歷的結(jié)果。如果是則返回true,否則返回false。假設(shè)輸入的數(shù)組的任意兩個(gè)數(shù)字都互不相同。
例如在下面的一顆二叉搜索樹中,輸入數(shù)組{5,7,6,9,11,10,8},則返回true,因?yàn)檫@個(gè)整數(shù)序列是下圖二叉搜索樹的后序遍歷結(jié)果。如果輸入的數(shù)組是{7,4,6,5},由于沒(méi)有哪棵二叉搜索樹的后序遍歷的結(jié)果是這個(gè)序列,因此返回false。
2解題思路與實(shí)現(xiàn)
思路:
在后序遍歷得到的序列中,最后一個(gè)數(shù)字是樹的根結(jié)點(diǎn)的值。數(shù)組中前面的數(shù)字可以分為兩部分:第一部分是左子樹結(jié)點(diǎn)的值,它們都比根結(jié)點(diǎn)的值小;第二部分是右子樹結(jié)點(diǎn)的值,它們都比根結(jié)點(diǎn)的值大。
因此,我們可以總結(jié)出算法步驟:
Step1.通過(guò)取出序列最后一個(gè)元素得到二叉搜索樹的根節(jié)點(diǎn);
Step2.在二叉搜索樹中左子樹的結(jié)點(diǎn)小于根結(jié)點(diǎn),因此可以遍歷一次得到左子樹;
Step3.在二叉搜索樹中右子樹的結(jié)點(diǎn)大于根結(jié)點(diǎn),因此可以繼續(xù)遍歷后序元素得到右子樹;
Step4.重復(fù)以上步驟遞歸判斷左右子樹是不是二叉搜索樹,如果都是,則返回true,如果不是,則返回false;
實(shí)現(xiàn):
3單元測(cè)試
單元測(cè)試用例:
// 10 // / \ // 6 14 // /\ /\ // 4 8 12 16 [TestMethod] public void SequenceTest1() {int[] data = { 4, 8, 6, 12, 16, 14, 10 };bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);Assert.AreEqual(result, true); }// 5 // / \ // 4 7 // / // 6 [TestMethod] public void SequenceTest2() {int[] data = { 4, 6, 7, 5 };bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);Assert.AreEqual(result, true); }// 5 // / // 4 // / // 3 // / // 2 // / // 1 [TestMethod] public void SequenceTest3() {int[] data = { 1, 2, 3, 4, 5 };bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);Assert.AreEqual(result, true); }// 1 // \ // 2 // \ // 3 // \ // 4 // \ // 5 [TestMethod] public void SequenceTest4() {int[] data = { 5, 4, 3, 2, 1 };bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);Assert.AreEqual(result, true); }// 樹中只有1個(gè)結(jié)點(diǎn) [TestMethod] public void SequenceTest5() {int[] data = { 5 };bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);Assert.AreEqual(result, true); }// 錯(cuò)誤序列 [TestMethod] public void SequenceTest6() {int[] data = { 7, 4, 6, 5 };bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);Assert.AreEqual(result, false); }// 錯(cuò)誤序列 [TestMethod] public void SequenceTest7() {int[] data = { 4, 6, 12, 8, 16, 14, 10 };bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);Assert.AreEqual(result, false); }// 錯(cuò)誤序列 [TestMethod] public void SequenceTest8() {bool result = SequenceHelper.VerifySquenceOfBST(null, 0);Assert.AreEqual(result, false); }測(cè)試結(jié)果:
測(cè)試的結(jié)果情況如下圖:
Ref參考資料
何海濤,《劍指Offer》
后臺(tái)回復(fù):劍指offer,即可獲得pdf下載鏈接喲!
????掃碼關(guān)注EdisonTalk
設(shè)為星標(biāo),不再失聯(lián)!
往期推文合集:2020年上半年推文合集
總結(jié)
以上是生活随笔為你收集整理的C#刷剑指Offer | 二叉搜索树的后序遍历序列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 跟我一起学.NetCore之中间件(Mi
- 下一篇: 新版 C# 高效率编程指南