驗(yàn)證二叉搜索樹(LeetCode--98驗(yàn)證二叉搜索樹)

題目

判斷一個(gè)二叉樹是否是一個(gè)有效的二叉搜索樹。(為與leetCode一致,假設(shè)所有節(jié)點(diǎn)的關(guān)鍵值不重復(fù))

解析

考察重點(diǎn):二叉搜索樹性質(zhì)
解題方法:
方法一:

中序遍歷。二叉搜索樹的中序遍歷結(jié)果是關(guān)鍵字有序的,如果結(jié)果中關(guān)鍵字并不是升序排列則不是二叉搜索樹。不需要記錄所有結(jié)果只需記錄當(dāng)前遍歷節(jié)點(diǎn)關(guān)鍵字和前一個(gè)節(jié)點(diǎn)關(guān)鍵字,比較兩者大小,如果不是升序排列即可斷定不是二叉搜索樹。

方法二:

遞歸方法。遞歸依次判斷每個(gè)節(jié)點(diǎn)是否滿足二叉搜索樹的性質(zhì),這里,當(dāng)前節(jié)點(diǎn)需要分別與它的左子樹的最右節(jié)點(diǎn)和右子樹的最左節(jié)點(diǎn)比較,觀察是否符合性質(zhì),如果符合性質(zhì)繼續(xù)校驗(yàn)其他節(jié)點(diǎn)。因?yàn)榧偃缬易訕涞淖钭蠊?jié)點(diǎn)不是當(dāng)前節(jié)點(diǎn)右子樹的最小節(jié)點(diǎn),雖然可以通過當(dāng)前節(jié)點(diǎn)的校驗(yàn),但是在之后校驗(yàn)右子樹其他節(jié)點(diǎn)時(shí)候會(huì)被發(fā)現(xiàn)不符合二叉搜索樹的性質(zhì)。

代碼
方法一:
public boolean isValidBST(TreeNode root) {
    if(null == root){
        return true;
    }
    int lastValue = 0;
    //初始化標(biāo)記,如果是true,則初始化lastValue,否則比較lastValue判斷是否符合二叉搜索樹條件
    boolean initial = true;
    Stack<TreeNode> stack = new Stack<>();
    TreeNode node = root;
    //迭代中序遍歷
    while(node != null){
        while(node != null){
            stack.push(node);
            node = node.left;
        }
        while(!stack.empty() && node == null){
            node = stack.pop();
            //初始化設(shè)置lastValue值
            if(initial){
                lastValue = node.val;
                initial = false;
            } else {//比較當(dāng)前節(jié)點(diǎn)與之前值大小,如果逆序則直接判斷不符合二叉搜索樹性質(zhì)
                if(node.val <= lastValue){
                    return false;
                } else {//更新lastValue值
                    lastValue = node.val;
                }
            }
            node = node.right;
        }
    }
    return true;
}
方法二:
public boolean isValidBST(TreeNode root) {
    if(null == root){
        return true;
    }
    //判斷當(dāng)前節(jié)點(diǎn)是否符合二叉搜索樹性質(zhì)
    TreeNode right = minRightChild(root.right);
    if(null != right && right.val <= root.val){
        return false;
    }
    TreeNode left = maxLeftChild(root.left);
    if(null != left && left.val >= root.val){
        return false;
    }
    //遞歸判斷左右子樹
    boolean r = isValidBST(root.right);
    boolean l = isValidBST(root.left);

    //左右子樹任一不滿足性質(zhì)則整棵樹不滿足性質(zhì)
    return l && r;
}

//右子樹中最左節(jié)點(diǎn)
private TreeNode minRightChild(TreeNode right){
    if(null == right){
        return null;
    }
    while(right.left != null){
        right = right.left;
    }
    return right;
}

//左子樹中最右節(jié)點(diǎn)
private TreeNode maxLeftChild(TreeNode left){
    if(null == left){
        return null;
    }
    while(left.right != null){
        left = left.right;
    }
    return left;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 樹形結(jié)構(gòu) 在前面章節(jié)中介紹到的數(shù)據(jù)結(jié)構(gòu),都為線性結(jié)構(gòu),比如鏈表,數(shù)組,隊(duì)列等,都屬于線性結(jié)構(gòu),類似于通過一根線串在...
    ducktobey閱讀 1,270評(píng)論 0 0
  • 樹的基本概念 節(jié)點(diǎn),根節(jié)點(diǎn),父節(jié)點(diǎn),子節(jié)點(diǎn),兄弟節(jié)點(diǎn)都是屬于樹的范濤; 一棵樹可以沒有任何節(jié)點(diǎn),稱為空樹; 一棵樹...
    coder_feng閱讀 1,129評(píng)論 0 0
  • 2019 iOS面試題大全---全方面剖析面試2018 iOS面試題---算法相關(guān)1、七種常見的數(shù)組排序算法整理(...
    Theendisthebegi閱讀 10,408評(píng)論 0 17
  • 介紹 二叉樹的結(jié)構(gòu) 二叉樹常考的原因有如下幾點(diǎn)1、它可以結(jié)合鏈表、棧、隊(duì)列和字符串等數(shù)據(jù)結(jié)構(gòu)出題2、需要熟練掌握?qǐng)D...
    雨住多一橫閱讀 456評(píng)論 0 1
  • 回顧二分搜索樹的定義 二分搜索樹的重要性質(zhì) 二分搜索樹的重要性質(zhì)如下,初學(xué)的時(shí)候經(jīng)常會(huì)被忽略或者錯(cuò)誤地理解: 左子...
    李威威閱讀 549評(píng)論 0 0