题目描述
- 思路1:我们在题解的时候,如果本题是在一颗普通的二叉树查找,可以穷举所有节点,这样适用于所有普通的二叉树:使用python进行书写:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
# 直接利用的是BST树结构中左小右大的性质,可以避免搜索整颗二叉树去寻找元素,从而很好的提升效率
class Solution(object):
def searchBST(self, root, val):
if root is None:
return None
if root.val == val:
return root
# 当前节点没有找到就递归的去左右子树中查找,python直接用简单变量来即可
left = self.searchBST(root.left, val)
right = self.searchBST(root.right, val)
# 最后进行相应返回即可
if left is not None:
return left
else:
return right
# return left is not None ? left : right
- 但是这样, 就没有利用上BST这个左小右大的特性,升级一下就是:不需要递归的搜索两边,类似于二分查找的思想,根据target和root.val 的大小进行比较,就能排除一边,使用java语言进行书写
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
// 直接利用的是BST树结构中左小右大的性质,可以避免搜索整颗二叉树去寻找元素,从而很好的提升效率
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
// 递归函数最应该考虑的就是递归出口
// 当根节点为空时
if (root == null){
return null;
}
// 去左子树搜索,因为就是要找到目标节点
if (root.val > val){
return searchBST(root.left, val);
}
// 去右子树中搜索
if (root.val < val){
return searchBST(root.right, val);
}
return root;
}
}