day38_0700.二叉搜索树中的搜索

0700.二叉搜索树中的搜索

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == NULL)   return NULL;
        if (root->val == val)   return root;
        TreeNode* result = new TreeNode;
        if (root->val > val)  result = searchBST(root->left, val);
        if (root->val < val)  result = searchBST(root->right, val);  
        return result;
    }
};
  • ac
  • 递归代码思路大体上没问题 但是对于返回结果这部分有些问题---见下
  • 关于result这个变量的定义和使用还不熟悉本质原因-----对递归的理解有些欠缺
    • 能想到如果要去分别遍历左子树 右子树 那么需要调用自己这个函数本身 但是函数需要一个返回值来承接 能想到或许需要定义一个TreeNode*类型的结点node-----------其实就是上述代码里的result 但是想不到最后需要return node------------即上述代码return result;
  • 对于返回值的处理 也可以这样
class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        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);
        return NULL;
    }
};
  • 有必要好好比较比较上述两段代码
  • 迭代法代码见下
class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == NULL)   return NULL;
        while (root != NULL) {
            if (root->val == val)   return root;
            if (root->val > val)    root = root->left;
            else
                root = root->right;
        }
        return NULL;
    }
};
  • 上面是我的 ac 下面是卡哥的ac
  • 注意 while里如果是三个if 那么前面的执行结果会影响到后面的 三个if不是并列!!!!
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;
    }
};
posted @ 2022-12-17 22:44  跬步瑶  阅读(26)  评论(0)    收藏  举报