判斷序列是否為二叉查找樹的后續遍歷

題目就是文章標題:

題目示例

這個題呢,就是考察大家對二叉查找樹的性質是不是很熟悉。

二叉查找樹的后序遍歷呢,就是三個部分組成:
左子樹-右子樹-根節點
這個條件對任何節點都是成立的。

所以,我們看頭結點,也就是最后一個數,我們可以發現,左子樹節點全部集中在左邊,而右子樹的節點全部集中在右邊,也就是說根據根節點的值可以把整個數組劃分成兩個部分,
左邊部分必須是全部小于根節點;右邊部分必須全部節點大于根節點。
所以我們先得到一個分界點,然后遍歷check是否符合上述性質。
如果滿足,我們對這兩個子部分遞歸的調用判斷就可以啦。

代碼:

for (i=beg; i < end; i++)
    {
        if (a[i]>target)
            break;
    }

這一段是從開始的位置開始,一直找到第一個大于root的點,也就是這個點左邊的都應該是左子樹,而右邊的都是右子樹。

        j = i;
    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);
這一段就是遞歸的判斷啦。
***
全部:(兩個函數的作用是一樣的,我開始寫的時候出bug。。調試用的)

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/)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容