劍指Offer的學習筆記(C#篇)-- 二叉搜索樹的後序遍歷序列

題目描述

輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。

一 . 解題思想與二叉搜索樹概念

        (1). 二叉樹的後序遍歷方法(左→右→根)。數組

        (2). 二叉查找樹,又被稱爲二叉搜索樹。其特色以下:設x爲二叉查找樹中的一個結點,x節點包含關鍵字key,一句話就是左孩子比父節點小,右孩子比父節點大,還有一個特性就是」中序遍歷「能夠讓結點有序。看下圖,解釋一下:spa

        

        能夠看出,在二叉樹中:code

  • 若任意節點的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;
  • 任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值;
  • 任意節點的左、右子樹也分別爲二叉查找樹;
  • 沒有鍵值相等的節點,同一個父節點的兩個同層的節點,左小於右。

二 . 解題思路

  (1). 經過取出序列最後一個元素獲得二叉搜索樹的根節點;blog

  (2). 在二叉搜索樹中左子樹的結點小於根結點,所以能夠遍歷一次獲得左子樹;遞歸

  (3). 在二叉搜索樹中右子樹的結點大於根結點,所以能夠繼續遍歷後序元素獲得右子樹;it

  (4). 重複以上步驟遞歸判斷左右子樹是否是二叉搜索樹,若是都是,則輸入yes,若是不是,則輸出no;io

三 . 代碼實現

class Solution
{
    public bool VerifySquenceOfBST(int[] sequence)
    {
        // write code here
        if(sequence.Length == 0)
        {
        return false;
        }
        return Verify(sequence, 0, sequence.Length-1);
    }
    public bool Verify(int[] sequence, int start, int end)
    {
        int root = sequence[end];
        int i = start;
        for(; i<end; i++)
        {
            if(sequence[i] > root)
            break;
        }
        int j = i;
        for(; j<end; j++)
        {
            if(sequence[j] < root)
            return false;
        }
        bool left = true;
        if(i-1 > start)
        {
            left = Verify(sequence, start, i-1);
        }
        bool right = true;
        if(i < end-1)
        {
            right = Verify(sequence, i, end-1);
        }
        return (left && right);
    }
}
相關文章
相關標籤/搜索