二叉樹-驗證二叉搜索樹

給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。

假設(shè)一個二叉搜索樹具有如下特征:

節(jié)點(diǎn)的左子樹只包含小于當(dāng)前節(jié)點(diǎn)的數(shù)。
節(jié)點(diǎn)的右子樹只包含大于當(dāng)前節(jié)點(diǎn)的數(shù)。
所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:

輸入:
    2
   / \
  1   3
輸出: true
示例 2:
輸入:
    5
   / \
  1   4
     / \
    3   6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
     根節(jié)點(diǎn)的值為 5 ,但是其右子節(jié)點(diǎn)值為 4 。
最后參考了甜姨sweetiee的題解,pre真的是一步到位啊
1.初始化一個最小值,用來作為最開始的前節(jié)點(diǎn),其實就是怎么樣第一次遍歷的判斷都是對的
2.根據(jù)中序遍歷的規(guī)則,從最左子節(jié)點(diǎn)開始遍歷,訪問左子樹,一直遞歸訪問到最后一個左子樹節(jié)點(diǎn)
3.判斷是否大于前一個節(jié)點(diǎn)的值(由于一開始設(shè)置了),不是的話,就返回false
4.遞歸訪問右子樹,右子樹有左子樹就先去到最左的子節(jié)點(diǎn)開始遍歷
復(fù)雜度分析:
時間復(fù)雜度 O(N): 遍歷了所有樹節(jié)點(diǎn),所以時間復(fù)雜度為N。
空間復(fù)雜度 O(1): 最差情況下,二叉樹退化為鏈表,系統(tǒng)使用 O(N) 大小的??臻g。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
    //利用中序遍歷的原理,所有遍歷的節(jié)點(diǎn)都比前一個節(jié)點(diǎn)的值大
class Solution {
    //初始化一個最小值,用來作為最開始的前節(jié)點(diǎn),其實就是怎么樣第一次遍歷的判斷都是對的
    long pre = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        //如果節(jié)點(diǎn)為空,直接返回true
        if(root == null) return true;
        
        //訪問左子樹,一直遞歸訪問到最后一個左子樹節(jié)點(diǎn)
        if(!isValidBST(root.left)){
            return false;
        }
        
        //判斷是否大于前一個節(jié)點(diǎn)的值(由于一開始設(shè)置了),不是的話,就返回false
        if(pre >= root.val) return false;
        pre = root.val;
        
        //訪問右子樹
        return isValidBST(root.right);
      
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容