【Day-33慢就是快】代码随想录-二叉树-二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

思路


什么是二叉搜索树:

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

本题就是在二叉搜索树中找一个节点。

递归法

1. 传入参数和返回值

传入树的根节点和主要查找的值,返回的是搜索值所在的节点。

2. 确定终止条件

如果根节点为空,或者找到此节点就返回

3. 单层递归的逻辑

因为二叉搜索树有序,可以有方向的去搜索。

如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。

TreeNode* result = NULL;
if (root->val > val) result = searchBST(root->left, val);
if (root->val < val) result = searchBST(root->right, val);
return result;

记得需要定义result来接收函数返回节点。

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if(root == NULL || root->val == val) return root;
        TreeNode* result = NULL;
        if(root->val > val) result = searchBST(root->left, val);
        if(root->val < val) result = searchBST(root->right, val);
        return result;
    }
};

迭代法

对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。

对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。

【Day-33慢就是快】代码随想录-二叉树-二叉搜索树中的搜索_第1张图片

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        while(root != NULL){
            if(root->val > val) root = root->left;
            else if(root->val < val) root = root->right;
            else
                return root;
        }
        return NULL;
    }
};

 

你可能感兴趣的:(代码随想录,c++,算法)