劍指offer 24 二叉搜尋樹的後序遍歷序列

2021-07-03 01:12:48 字數 2363 閱讀 1859

二叉搜尋樹的性質是:元素的左子樹上的元素全部小於該元素,右子樹上的元素全部大於該元素。後序遍歷根節點總是在最後,所以根據後序遍歷順序可以得到根元素,並且得到根元素的左子樹和右子樹。

假設樹的後序遍歷順序為: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...