目录
问题描述:
实现代码与解析:
递归:
原理思路:
迭代:
原理思路:
问题描述:
给定二叉搜索树(BST)的根节点 root
和一个整数值 val
。
你需要在 BST 中找到节点值等于 val
的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null
。
示例 1:
输入:root = [4,2,7,1,3], val = 2 输出:[2,1,3]
示例 2:
输入:root = [4,2,7,1,3], val = 5 输出:[]
实现代码与解析:
递归:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val)
{
//若遇到空结点或者找到目标结点
if(root==NULL||root->val==val) return root;
TreeNode* result=NULL;
if(root->val>val) result=searchBST(root->left,val);
if(root->val<val) result=searchBST(root->right,val);
return result;
}
};
原理思路:
首先我们要知道什么是二叉搜索树:
1、若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
2、若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
3、任意结点的左、右子树也分别为二叉搜索树。
复杂度:
不论哪一种操作,该树所花的时间都和树的高度成正比。因此,如果共有n个元素,那么平均每次操作需要O(logn)的时间。
了解了搜索二叉树这道题写起来就比较简单了,我们利用它的特性来进行遍历,在递归方法中,首先确定终止条件,就是遇到空结点或者遇到目标结点时返回,然后确定递归逻辑,由于二叉搜索树是有序的,所以我们可以有方向的去搜索,若目标值val大于根节点的值,就向右子树搜索,若val小于根节点的值,就向左子树搜索:
if(root->val>val) result=searchBST(root->left,val);
if(root->val<val) result=searchBST(root->right,val);
还是比较简单的。
迭代:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val)
{
while(root!=NULL)
{
if(root->val==val) return root;
else if(root->val>val) root=root->left;
else root=root->right;//root->val<val
}
return NULL;
}
};
原理思路:
还是利用二叉搜索树的性质,用跌打比递归简单的题还是比较少见的,大家自己看代码就能看懂。