leetcode 98 驗證二叉搜尋樹 c

2021-09-25 13:35:24 字數 1078 閱讀 6888

### 題目

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

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

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

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

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

### 思路

按照二叉搜尋樹的定義,分別將它的左子樹和右子樹是否為二叉搜尋樹進行分別判斷,例如zuo判斷,如果節點沒有左子樹,則返回true,若節點有左子樹,那節點要比所有的左子樹的值大,需要乙個棧將所有的左子樹的值存入進行比較,然後再對節點的左節點進行左右子樹是否為二叉搜尋樹判斷,you判斷同理,這裡面會有大量的比較。沒有利用上比如a大於b,b大於c,那a肯定大於c,而是做了兩次比較a是否大於c,b是否大於c,存在冗餘計算。

### code

解法一(40ms,最開始自己寫的)

bool iszuo(treenode* root)

return iszuo(root->left)&&isyou(root->left);

}bool isyou(treenode* root)

return iszuo(root->right)&&isyou(root->right);

}bool isvalidbst(treenode* root)

### 思路

我們利用前序遍歷對二叉樹進行一次遍歷,根據前序遍歷的定義,首先遍歷樹的左子樹,在遍歷中間根節點,在遍歷右子樹,這樣就相當於將二叉樹從最左端的葉子開始慢慢遍歷,乙個根節點,只有在它的左邊的節點全部進入遍歷陣列之後它才會進入遍歷陣列,它的右子樹只有在它進入遍歷陣列之後才會進入遍歷陣列,所以我們將其實現前序遍歷之後,只要比較陣列是否是有序的就可以了。相比上乙個對每乙個子樹進行檢查,速度快了一倍。

### code

解法二(利用前序遍歷實現乙個陣列,16ms)

void qianxuf(vector&qianxu,treenode* root)//要記得用&還是*

bool isvalidbst(treenode* root)

return true;

}

leetcode 98 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 1 3 輸出 true 示例 2 輸入 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 關鍵資訊 1二叉搜尋樹的中序遍歷是遞...

leetcode 98 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 解題思路 中序遍歷遞增,每次只...

leetcode 98 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 如果對二叉搜尋樹不夠了解,可能...