思路:需要遍歷樹,二叉排序樹的特點是 lchild.key < root.key < rchild.key
那麼我們使用分治思想,先利用上面特點將左右子樹分開,遇到第一個大於root.key的之後(右邊)就是右子樹,那麼當我們在遍歷右子樹的時候如果遇到小於root.key的情況,那麼就是錯誤的序列。
1 #include "stdafx.h"
2 #include<stdio.h>
3
4
5 // BST:Binary Search Tree,二叉搜索樹
6 bool VerifySquenceOfBST(int sequence[], int length)
7 {
8 if(sequence == NULL || length <= 0)
9 return false;
10
11 int root = sequence[length - 1];
12
13 // 在二叉搜索樹中左子樹的結點小於根結點
14 int i = 0;
15 for(; i < length - 1; ++i)
16 {
17 if(sequence[i] > root)
18 break;
19 }
20
21 // 在二叉搜索樹中右子樹的結點大於根結點
22 int j = i ;
23 for(; j < length - 1; ++j)
24 {
25 if(sequence[j] < root)
26 return false;
27 }
28
29 // 判斷左子樹是不是二叉搜索樹
30 bool left = true;
31 if(i > 0)
32 left = VerifySquenceOfBST(sequence, i);
33
34 // 判斷右子樹是不是二叉搜索樹
35 bool right = true;
36 if(i < length - 1)
37 right = VerifySquenceOfBST(sequence + i , length - i - 1) ;
38
39 return (left && right);
40 }
41
42
43 int main()
44 {
45
46 //test1
47 // 10
48 // / \
49 // 6 14
50 // /\ /\
51 // 4 8 12 16
52 int data1[] = {4, 8, 6, 12, 16, 14, 10};
53 int length1 = sizeof(data1) / sizeof(int);
54 printf("test1: ");
55 if(VerifySquenceOfBST(data1, length1))
56 printf("Yes\n");
57 else
58 printf("No\n");
59
60 //test2
61 // 5
62 // /
63 // 4
64 // /
65 // 3
66 // /
67 // 2
68 // /
69 // 1
70
71 int data2[] = {5, 4, 3, 2, 1};
72 int length2 = sizeof(data2)/sizeof(int);
73 printf("test2: ");
74 if(VerifySquenceOfBST(data2, length2))
75 printf("Yes\n");
76 else
77 printf("No\n");
78
79 //test3
80 // 5
81 // / \
82 // 4 7
83 // /
84 // 6
85
86 int data3[] = {4, 6, 7, 5};
87 int length3 = sizeof(data3)/sizeof(int);
88 printf("test3: ");
89 if(VerifySquenceOfBST(data3, length3))
90 printf("Yes\n");
91 else
92 printf("No\n");
93
94 //test4
95 // NULL
96
97 printf("test4: ");
98 if(VerifySquenceOfBST(NULL, 0))
99 printf("Yes\n");
100 else
101 printf("No\n");
102
103 return 0;
104 }
