给出二叉搜索树(BST)的根节点和一个值。您需要在BST中找到该节点的值等于给定值的节点。返回以该节点为根的子树。如果该节点不存在,则应返回NULL。
这是我为我的代码所得到的:
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if root == None:
return None
elif root.val == val:
return root
elif root.val>val:
root = self.searchBST(root.left,val)
else:
root = self.searchBST(root.right,val)
似乎输出None。 但是如果替换行
root = self.searchBST(root.left,val)
使用
return self.searchBST(root.left,val)
与root.right相同
然后它起作用。 我不太擅长递归,但是我们该怎么办
return self.searchBST(root.left,val)
searchBST(..)是否返回TreeNode,所以我们不必将treenode放在变量root中吗?
答案 0 :(得分:0)
否,如上所述,您需要返回与val相匹配的节点。
为此,如果找到该值,则必须返回该节点的地址,否则将返回None。
为了向后传播根值或Null值(如果找不到),因此您必须在每一步都返回一些地址。
如果您对递归有疑问,请进行迭代遍历。
root iterativeSearch(struct Node* root, int key)
{
// Traverse untill root reaches to dead end
while (root != NULL) {
// pass right subtree as new tree
if (key > root->data)
root = root->right;
// pass left subtree as new tree
else if (key < root->data)
root = root->left;
else
return root; // if the key is found return 1
}
return Null;
}
转到此处进行递归可视化:https://www.cs.usfca.edu/~galles/visualization/BST.html
答案 1 :(得分:0)
您必须明确告诉Python您要函数返回的内容。这就是您在return None
和return root
行中所做的事情。
在left
和right
情况下,您仅更改参数root
的局部值,而不更改函数范围之外的任何内容。
没有明确的return
与return None
相同。
用root =
替换两个return
应该确实可以完成工作。
答案 2 :(得分:0)
class Solution(object):
def is_leaf(self,root):
return root.left is None and root.right is None
def searchBST(self, root, val):
if root is None:
return root
if self.is_leaf(root):
if root.val == val:
return root
return None
if root.val == val:
return root
elif val < root.val:
return self.searchBST(root.left,val)
else:
return self.searchBST(root.right,val)