面試題33 二叉搜尋樹的後序遍歷序列(基本沒思路)

2021-08-29 04:08:39 字數 2229 閱讀 5937

一、題目

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。

二、關鍵

1.遞迴思想。

2.分組和分組依據(最後乙個是根節點+比根小的是左子樹,比根大的是右子樹)。

三、解釋

1.解題依據:在後序遍歷得到的序列中,最後乙個數字是樹的根節點的值。陣列中前面的數字可以分為兩個部分:第乙個部分是左子樹節點的值,它們都比根節點的值小;第二部分是右子樹節點的值,它們都比根節點的值大。

2.解題思路:

四、**

#include // bst:binary search tree,二叉搜尋樹

bool verifysquenceofbst(int sequence, int length)

// 在二叉搜尋樹中右子樹的結點大於根結點

int j = i;

for(; j < length - 1; ++ j)

// 判斷左子樹是不是二叉搜尋樹

bool left = true;

if(i > 0)

left = verifysquenceofbst(sequence, i);

// 判斷右子樹是不是二叉搜尋樹

bool right = true;

if(i < length - 1)

right = verifysquenceofbst(sequence + i, length - i - 1);

return (left && right);

}// ********************測試**********************

void test(const char* testname, int sequence, int length, bool expected)

// 10

// / \

// 6 14

// /\ /\

// 4 8 12 16

void test1()

; test("test1", data, sizeof(data)/sizeof(int), true);

}// 5

// / \

// 4 7

// /

// 6

void test2()

; test("test2", data, sizeof(data)/sizeof(int), true);

}// 5

// /

// 4

// /

// 3

// /

// 2

// /

// 1

void test3()

; test("test3", data, sizeof(data)/sizeof(int), true);

}// 1

// \

// 2

// \

// 3

// \

// 4

// \

// 5

void test4()

; test("test4", data, sizeof(data)/sizeof(int), true);

}// 樹中只有1個結點

void test5()

; test("test5", data, sizeof(data)/sizeof(int), true);

}void test6()

; test("test6", data, sizeof(data)/sizeof(int), false);

}void test7()

; test("test7", data, sizeof(data)/sizeof(int), false);

}void test8()

int main(int argc, char* argv)

面試題33 二叉搜尋樹的後序遍歷序列

題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的陣列的任意兩個數字都互不相空間 思路 由於題目沒有給出二叉樹長什麼樣子,只給了乙個陣列,所以我們要從陣列中找到二叉搜尋樹後序序列的規律。後序序列的最後乙個元素是樹的根結點,因此...

劍指 面試題33 二叉搜尋樹的後序遍歷

題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的陣列的任意兩個數字都互不相同。思路 1 遞迴判斷左右子樹是不是二叉搜尋樹。2 輸入序列的最後乙個元素是二叉搜尋樹的根節點,前面的可分為左右子樹,其中左子樹小於根節點,右子樹大於...

面試題33 二叉搜尋樹的後序遍歷序列 遞迴法

採用先序遍歷 自頂向下的方式 分解原問題。本題的關鍵點在於,如果劃分左 右子樹和根節點。由於題目假定陣列為後序遍歷,存在如下規律 最後乙個節點必為根節點 區間從左到右,第乙個大於根節點的值為右子樹的根節點。以上述兩點可以劃分左 右子樹和根節點。依據左 右子樹不斷的遞迴求解。返回條件 區間長度小於1時...