題目就是文章標題:
這個題呢,就是考察大家對二叉查找樹的性質(zhì)是不是很熟悉机断。
二叉查找樹的后序遍歷呢楷拳,就是三個部分組成:
左子樹-右子樹-根節(jié)點
這個條件對任何節(jié)點都是成立的。
所以吏奸,我們看頭結點欢揖,也就是最后一個數(shù),我們可以發(fā)現(xiàn)奋蔚,左子樹節(jié)點全部集中在左邊她混,而右子樹的節(jié)點全部集中在右邊烈钞,也就是說根據(jù)根節(jié)點的值可以把整個數(shù)組劃分成兩個部分,
左邊部分必須是全部小于根節(jié)點坤按;右邊部分必須全部節(jié)點大于根節(jié)點毯欣。
所以我們先得到一個分界點,然后遍歷check是否符合上述性質(zhì)臭脓。
如果滿足酗钞,我們對這兩個子部分遞歸的調(diào)用判斷就可以啦。
代碼:
for (i=beg; i < end; i++)
{
if (a[i]>target)
break;
}
這一段是從開始的位置開始谢鹊,一直找到第一個大于root的點算吩,也就是這個點左邊的都應該是左子樹,而右邊的都是右子樹佃扼。
j = i;
for (; j < end; j++)
{
if (a[j] < target)
return false;
}
這一段呢偎巢,就是基于上面的假設,判斷數(shù)組的右邊是否滿足右子樹的要求兼耀。
bool left = true;
if (i>beg)
left=isPrintTree(a, beg, i-1);
bool right = true;
if (i<end-1)
right =isPrintTree(a, i, end-1);
return (left&&right);
這一段就是遞歸的判斷啦压昼。
***
全部:(兩個函數(shù)的作用是一樣的,我開始寫的時候出bug瘤运。窍霞。調(diào)試用的)
bool isPrintTree(int* a, int beg, int end)
{
if (!a )
return false;
int j;//seperate point
int target = a[end];
//check between beg & end-1
int i = beg;
//int i = 0;
/while ((i <= end - 1)&&a[i]<target)
i++;/
//ver2:
/for (i = beg; i<end; i++)
{
if (a[i]>target)
break;
}/
//ver3:
for (i=beg; i < end; i++)
{
if (a[i]>target)
break;
}
//when breaks:a[i]>target
j = i;
/*while ((i <= end - 1) && a[i] > target)
i++;*/
/*if (i != end - 1)
return false;*/
//ver2:
for (; j < end; j++)
{
if (a[j] < target)
return false;
}
bool left = true;
if (i>beg)
left=isPrintTree(a, beg, i-1);
bool right = true;
if (i<end-1)
right =isPrintTree(a, i, end-1);
return (left&&right);
}
bool verifySquenceOfBST(int squence[], int length)
{
if (squence == NULL || length <= 0)
return false;
// root of a BST is at the end of post order traversal squence
int root = squence[length - 1];
// the nodes in left sub-tree are less than the root
int i = 0;
for (; i < length - 1; ++i)
{
if (squence[i] > root)
break;
}
// the nodes in the right sub-tree are greater than the root
int j = i;
for (; j < length - 1; ++j)
{
if (squence[j] < root)
return false;
}
// verify whether the left sub-tree is a BST
bool left = true;
if (i > 0)
left = verifySquenceOfBST(squence, i);
// verify whether the right sub-tree is a BST
bool right = true;
if (i < length - 1)
right = verifySquenceOfBST(squence + i, length - i - 1);
return (left && right);
}
文章參考[何海濤大神文章](http://zhedahht.blog.163.com/)