leetcode熱題精選 98 驗證二叉搜尋樹

2021-10-01 01:51:24 字數 1579 閱讀 3820

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

假設乙個二叉搜尋樹具有如下特徵:

節點的左子樹只包含小於當前節點的數。

節點的右子樹只包含大於當前節點的數。

所有左子樹和右子樹自身必須也是二叉搜尋樹。

示例 1:

輸入:2

/ 1 3

輸出: true

示例 2:

輸入:5

/ 1 4

/ 3 6

輸出: false

解釋: 輸入為: [5,1,4,null,null,3,6]。

根節點的值為 5 ,但是其右子節點值為 4 。

分析:本題和101題的對稱二叉樹是類似的方法和原理,都是基於樹的遞迴遍歷,只不過訪問過程visit的邏輯不同,由於訪問visit的邏輯不同,因此構造的輔助函式的返回值邏輯不同。

在101題中,通過構造乙個輔助函式,比較兩棵樹是否是對稱的,然後在主函式中對左右的子樹進行遞迴呼叫就可以了,最後將結果整合就足以判斷。

在本題98題中,我一開始也想著判斷左右子樹是否是搜尋樹,再判斷左右子樹的根結點和目前根節點就可以得到結果了。但是實際上這是不全面的。即,搜尋樹的子樹一定是搜尋樹;但是左右子樹是搜尋樹,而且左右結點與當前根節點滿足大小關係,但是遞推回去並不一定是搜尋樹!如下圖所示

於是我修改了輔助函式,兩個輔助函式分別判斷整棵樹的值是否小於某個數,即helper,helper2兩個函式。然後最判斷一棵樹是否是搜尋樹,需要判斷左右子樹的結點是否都大於或小於根節點的值(res1,res2),還需要判斷左右子樹是否都是搜尋樹(即遞迴遍歷isvalidbst,res3,res4);因此最終得到的結果需要綜合4個來判斷。

class solution 

if(root->left)

res3=isvalidbst(root->right);

res4=isvalidbst(root->left);

return res1&&res2&&res3&&res4;

}*/

bool helper(treenode* root,int num)

bool helper2(treenode* root,int num)

bool isvalidbst(treenode* root)

};

該解法一般情況下時間複雜度是o(nlogn),此時空間複雜度是o(n)

但是最壞的情況是o(n^2),此時空間複雜度是o(n)

leetcode的官方的改進方法是使用了更多的函式介面,也就是往下訪問的時候有了更多的判斷,對於乙個結點的判斷,給出它的上下界,同時對於它的左右子樹也給出上下界的調整。這樣在每個點只要訪問一次即可,訪問的複雜度是1,因此最終就是o(n)的複雜度。

class solution 

public boolean isvalidbst(treenode root)

}

leetcode騰訊精選50題(1)

菜鳥第一課 給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素...

leetcode 騰訊精選50題 21

given a linked list,rotate the list to the right by k places,where k is non negative.鍊錶的特殊性在於其可以只改變其所指向的位址,而不改變資料存放的真正位址,於是將其收尾閉合後可直接得到乙個閉環的鍊錶,在將其在指定的...

leetcode 騰訊精選50題 LRU快取機制

題目如下 運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入...