一、題目
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回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時...