二叉搜索树递归出口问题

    
TreeNode* searchBST(TreeNode* root, int val) {
    if(root == nullptr) return root;
    if(root->val ==val)  {
        return root;
    }
    TreeNode* res = nullptr;
     res=searchBST(root->left,val);
     res= searchBST(root->right,val);
    return res;
}

这是我写的代码,不知道为什么。总是返回0,我在这里纠结了一个多小时。如果找到了val,就直接返回了呀!为什么会返回为空呢?

答案:如果不用if条件限制住,那么即便找到了符合条件的节点,递归依然会继续进行,直到最后找到null,返回了null。举个例子,假设有二叉树4,3,5,我想找到3这个节点。先判断4,4既不是空也不符合条件,递归。root->left,开始判断3,3符合条件了,res = 3号节点!但是这个时候我的两行递归代码还没有结束啊!还有一行4的res = searchBST(root->right, val);没有执行,于是要继续执行,到了5,5不是null也不符合条件,继续进行5的res=searchBST(root->left,val),然后发现5的左孩子为空,好家伙,res变成了null。但是这个null还不是最终的null !,还有一句5的res = searchBST(root->right, val)没执行,于是去看5的右孩子,右孩子为空,返回了null,res再次赋值为null,这个才是最终res的null,也就是5的右孩子!!所以如果不加上附加条件的话,返回的永远都是这棵树的最右下的节点。

正确代码应该加上限制条件:

        if (root->val > val) result = searchBST(root->left, val);
        if (root->val < val) result = searchBST(root->right, val);

4比3大,往左递归,发现了3==val,直接就return了, 这个是时候的res是3,并且因为附加了if语句的条件,别的递归就不会再进行了。因为他不符合if条件!语句就不会被覆盖了!

但是我换了一种思路:使用了这个代码:

void traversal(TreeNode* root, int val,int res,TreeNode*& tree) {
    if(root == nullptr) return;
    if(root->val ==val)  {
        res = 1;
        tree = root;
    }
    traversal(root->left,val,res,tree);
    traversal(root->right,val,res,tree);
}

TreeNode* searchBST(TreeNode* root, int val) {
   int res = 0;
   TreeNode* tree = new TreeNode(-1);
    traversal(root,val,res,tree);
    if(tree->val == -1)  return nullptr;
    return tree;
}

我这里就没有加上限定条件呀,为什么不会被覆盖呢?

因为:只有当root-> val == val的时候,才会修改最终的返回值。

而前面的代码,当root == null 的时候,也会修改返回值

我这里的逻辑就是,如果找到了符合条件的节点那么就返回该节点,找不到了,最终返回null。

上面代码递归的逻辑是,节点为null或者符合条件,就应该退出递归了,不然就是循环。所以为了防止死循环,就不得不将null也赋值给res。所以不加限定条件,就覆盖了应该想要得到的结果!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值