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。所以不加限定条件,就覆盖了应该想要得到的结果!