日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#刷剑指Offer | 二叉搜索树的后序遍历序列

發(fā)布時(shí)間:2023/12/4 C# 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#刷剑指Offer | 二叉搜索树的后序遍历序列 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【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):

public static bool VerifySquenceOfBST(int[] sequence, int length) {if (sequence == null || length <= 0){return false;}int root = sequence[length - 1];int i = 0;// 在二叉搜索樹中左子樹的結(jié)點(diǎn)小于根結(jié)點(diǎn)for (; i < length - 1; i++){if (sequence[i] > root){break;}}// 在二叉搜索樹中右子樹的結(jié)點(diǎn)大于根結(jié)點(diǎn)int j = i;for (; j < length - 1; j++){if (sequence[j] < root){// 如果找到小于根節(jié)點(diǎn)直接返回falsereturn false;}}// 判斷左子樹是不是二叉搜索樹bool leftIsBST = true;if (i > 0){leftIsBST = VerifySquenceOfBST(sequence, i);}// 判斷右子樹是不是二叉搜索樹bool rightIsBST = true;if (j < length - 1){// C#中無(wú)法直接操作指針,在C/C++可以直接傳遞sequence+iint[] newSequence = sequence.Skip(i).ToArray();rightIsBST = VerifySquenceOfBST(newSequence, length - i - 1);}return leftIsBST && rightIsBST; }

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。