leetcode 700. 二叉搜尋樹中的搜尋 思考分析
題目
給定二叉搜尋樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。
1、不考慮BST性質,直接遞迴遍歷
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
TreeNode* NewRoot = NULL;
TreeNode* traversal(TreeNode* root, int val)
{
if(root == NULL) return NewRoot ;
if(root->val == val)
{
NewRoot = root;
return NewRoot;
}
traversal(root->left,val);
traversal(root->right,val);
return NewRoot;
}
public:
TreeNode* searchBST(TreeNode* root, int val) {
return traversal(root,val);
}
};
2、回顧BST性質
二叉搜尋樹是一個有序樹:
1、若它的左子樹不空,則左子樹上所有的結點的值均小於它的根結點的值
2、若它的右子樹不空,則右子樹上所有的結點的值均大於它的根結點的值
3、它的左右子樹也分別為二叉搜尋樹
3、利用BST性質進行遍歷
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
//列印資訊
// if(root == NULL) cout<<"NULL"<<endl;
// else cout<<root->val<<endl;
//
if(root == NULL || root->val == val) return root;
if(root->val > val) return searchBST(root->left,val);
if(root->val < val) return searchBST(root->right,val);
//如果沒有找到就返回NULL
return NULL;
}
};
因為搜尋到了目標結點,就要立即return了,這樣才是找到了結點就返回,如果此時不return就會遍歷整棵樹。
4、簡單的迭代方法
由於BST的性質導致我們不需要用棧模擬深度或者佇列模擬廣度,甚至也不需要使用回溯的思想。因為樹結點排列有序,你只要每到一個結點進行一次判斷,就可以選擇到正確的方向了。
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
//列印資訊
// if(root == NULL) cout<<"NULL"<<endl;
// else cout<<root->val<<endl;
while(root!=NULL)
{
//進行判斷方向
if(root->val > val) root=root->left;
else if(root->val < val ) root=root->right;
//如果不符合規則就返回根結點
else return root;
}
//如果沒有找到就返回NULL
return NULL;
}
};
相關文章
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 二叉搜尋樹
- 程式碼隨想錄 第20天 20的總結沒看 | 654.最大二叉樹 ● 617.合併二叉樹 ● 700.二叉搜尋樹中的搜尋 ● 98.驗證二叉搜尋樹二叉樹
- 程式碼隨想錄演算法訓練營第第20天 | 654.最大二叉樹 、617.合併二叉樹 、700.二叉搜尋樹中的搜尋、98.驗證二叉搜尋樹演算法二叉樹
- 程式碼隨想錄演算法訓練營第十七天| 654.最大二叉樹 , 617.合併二叉樹 , 700.二叉搜尋樹中的搜尋 , 98.驗證二叉搜尋樹演算法二叉樹
- 二叉搜尋樹的操作集
- 二叉搜尋樹的結構
- 【LeetCode】98. 驗證二叉搜尋樹LeetCode
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- LeetCode-173-二叉搜尋樹迭代器LeetCode
- LeetCode98. 驗證二叉搜尋樹LeetCode
- [leetCode]95. 不同的二叉搜尋樹 IILeetCode
- LeetCode-096-不同的二叉搜尋樹LeetCode
- 96. 不同的二叉搜尋樹
- javascript實現二叉搜尋樹JavaScript
- 有序表和搜尋二叉樹二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- LeetCode-095-不同的二叉搜尋樹 IILeetCode
- 【ALGO】Leetcode 98.驗證二叉搜尋樹GoLeetCode
- leetcode-1382. 將二叉搜尋樹變平衡LeetCode
- LeetCode-098-驗證二叉搜尋樹LeetCode
- dfs 驗證搜尋二叉樹——leetcode98二叉樹LeetCode
- 701. 二叉搜尋樹中的插入操作
- Leedcode-二叉搜尋樹中的眾數
- 如何在 Java 中實現二叉搜尋樹Java
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- 二叉搜尋樹的python實現Python
- 演算法篇 - 二叉搜尋樹演算法
- 資料結構-二叉搜尋樹資料結構
- 【資料結構】二叉搜尋樹!!!資料結構
- 二叉搜尋樹程式碼例項
- LeetCode-099-恢復二叉搜尋樹LeetCode
- 程式碼隨想錄day18 || 530 二叉搜尋樹最小差,501 二叉搜尋樹眾數,236 二叉搜尋樹最近公共祖先
- 程式碼隨想錄演算法訓練營day22 | leetcode 235. 二叉搜尋樹的最近公共祖先、701. 二叉搜尋樹中的插入操作、450. 刪除二叉搜尋樹中的節點演算法LeetCode
- LeetCode-230-二叉搜尋樹中第K小的元素LeetCode