leetcode 700. 二叉搜尋樹中的搜尋 思考分析

拾牙慧者發表於2020-10-24

題目

給定二叉搜尋樹(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;
    }
};

相關文章