Leetcode数据结构入门第十三天(二叉搜索树)
700. 二叉搜索树中的搜索
题目描述
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
样例
输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]
输入:root = [4,2,7,1,3], val = 5
输出:[]
思路
按照二叉搜索树的性质:
左子树所有节点的元素值均小于根的元素值;
右子树所有节点的元素值均大于根的元素值。
直接进行遍历二叉搜索树,让待搜索的节点值与当前根节点比较,比他小就往左子树搜索,比他大就往右子树搜索,相等就返回。
参考代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
//二叉搜索树
while(root!=NULL)
{
//待搜索的节点小于根节点,往左子树搜索
if(val<root->val) root=root->left;
//待搜索的节点值大于根节点的,往右子树搜索
else if(val>root->val) root=root->right;
//相等的,返回根节点
else if(val==root->val) return root;
}
//遍历结束后,还没返回说明没有找到,返回空
return NULL;
}
};
701. 二叉搜索树中的插入操作
题目描述
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
样例
输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]
思路
根据二叉搜索树的性质,搜索要插入的位置,找到了就插入即可,比较简单。。。
参考代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
TreeNode* temp=root;//保留一开始的根节点,便于返回
int left,right;//标志
//找到插入的位置
while(root!=NULL)
{
//待插入值比根节点小,往左子树:
if(val<root->val)
{
//左子树非空,继续搜索
if(root->left) root=root->left;
//左子树为空,直接插入并返回即可
else
{
root->left=new TreeNode(val);
return temp;
}
}
//待插入值比根节点大,往右子树:
else if(val>root->val)
{
//右子树非空,继续搜索
if(root->right) root=root->right;
//右子树为空,插入
else
{
root->right=new TreeNode(val);
return temp;
}
}
}
//如果一开始为空,直接新建节点返回
temp=new TreeNode(val);
return temp;
}
};