二叉搜尋樹的性質是:元素的左子樹上的元素全部小於該元素,右子樹上的元素全部大於該元素。後序遍歷根節點總是在最後,所以根據後序遍歷順序可以得到根元素,並且得到根元素的左子樹和右子樹。
假設樹的後序遍歷順序為:3,7,4,6,5;可以判斷出:5是根節點,3為根節點的左子樹,7,4,6是根節點的右子樹,但是右子樹需要保證所有節點大於根節點,所以這個順序不是二叉搜尋樹的後序遍歷順序。
解題思路:在標識出左右子樹時,遍歷右子樹,發現右子樹中的元素小於其父節點,則順序為錯誤的。
#include #includeusing namespace std;
struct binarytreenode
;binarytreenode* createbinarytreenode(int value)
void connecttreenodes(binarytreenode* root ,binarytreenode* left, binarytreenode* right)
}
void destroytree(binarytreenode* root) }
bool verifysquenceofbst(int data, int length)
int j = i;
while (j < length-1)
bool left = true, right = true;
if (i > 0) // i>0 表示左子樹至少有乙個節點
left = verifysquenceofbst(data, i); // 遞迴判斷左子樹是否符合bst的性質
if (i < length-1)
right = verifysquenceofbst(data + i, length - i - 1);// -1是因為root節點不用再處理
return (left && right);
} void test(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)
劍指Offer 24 二叉搜尋樹的後續遍歷序列
題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路 後序遍歷為lrv。因此陣列最後一位為根節點。陣列前半段為其左子樹,後半段為其右子樹,再每層遞迴時,我們找到左右子樹的分割點,分別判斷左右子樹是否小於 ...
劍指offer 24 二叉搜尋樹的後序遍歷序列
題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路 既然是二叉搜尋樹,那麼排好序的陣列就是這棵樹的中序遍歷序列 使用中序遍歷序列和後序遍歷序列即可構造這棵樹 如果構造失敗,那這個序列就不是某一顆二叉搜尋...
劍指offer24 二叉樹的後序遍歷
思想 輸入乙個陣列,該陣列最後乙個元素即二叉樹的根節點,剩下的是左子樹和右子樹,左子樹比根節點小,右子樹比根節點大,循壞遍歷左右子樹 public class verifysequerceofbst if cut 0 verifysequenceofbst arrays.copyofrange ar...