[LeetCode] Insert into a Binary Search Tree 二叉搜索树中插入结点
Given the root node of a binary search tree (BST) and a value to be inserted into the tree, insert the value into the BST. Return the root node of the BST after the insertion. It is guaranteed that the new value does not exist in the original BST.
Note that there may exist multiple valid ways for the insertion, as long as the tree remains a BST after insertion. You can return any of them.
For example,
Given the tree:
4
/ \
2 7
/ \
1 3
And the value to insert: 5
You can return this binary search tree:
4
/ \
2 7
/ \ /
1 3 5
This tree is also valid:
5
/ \
2 7
/ \
1 3
\
4
这道题让我们在二叉搜索树中插入结点,当前还需要保持二叉搜索树的性质,那么插入结点的方式就有多种,就像题目中给的那个例子。结点5可以有不同的方法,但是很显然,放在结点7的左子结点比代替结点4成为根结点要来的简单许多。怎么简单我们就怎么来,所以还是按照简单的来吧。由于二叉搜索树自带二分的性质,那么首先根结点比较,如果大于根结点值的话,说明肯定要插入到右子树中。所以接下来跟7比较,对于递归函数来说,结点7也可以当作是一个新的根结点,那么由于结点7的值大于目标值5,所以要去其左子树,我们发现其左子结点为空,那么我们就可以根据目标值来生成一个新的结点,然后连到结点7的左子树上即可。那么在递归函数中,首先判断当前结点是否为空,为空的话就新建一个结点返回。否则就判断当前结点值是否大于目标值,是的话就对左子结点调用递归函数,并将返回值赋给当前结点的左子结点,否则就对右子结点调用递归函数,并将返回值赋给当前结点的右子结点,最后返回当前结点即可,参见代码如下:
解法一:
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (!root) return new TreeNode(val);
if (root->val > val) root->left = insertIntoBST(root->left, val);
else root->right = insertIntoBST(root->right, val);
return root;
}
};
我们也可以不使用递归来做,而是用迭代。整体思路跟递归并没有太大的区别,但没有递归写法简洁。首先还是判空,若为空,就新建结点返回。然后用一个变量cur来遍历,在while循环中,如果当前值大于目标值,如果其左子结点不存在,那么我们新建结点,并连上其左子结点,并跳出循环;若左子结点存在,则cur指向其左子结点。否则,当前值小于目标值,若其右子结点不存在,新建结点并连上其右子结点,并跳出循环;若右子结点存在,则cur指向其右子结点。最后返回root即可,参见代码如下:
解法二:
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (!root) return new TreeNode(val);
TreeNode *cur = root;
while (true) {
if (cur->val > val) {
if (!cur->left) {cur->left = new TreeNode(val); break;}
cur = cur->left;
} else {
if (!cur->right) {cur->right = new TreeNode(val); break;}
cur = cur->right;
}
}
return root;
}
};
类似题目:
Search in a Binary Search Tree
参考资料:
https://leetcode.com/problems/insert-into-a-binary-search-tree/
https://leetcode.com/problems/insert-into-a-binary-search-tree/discuss/150757/java-iterative-100
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Insert into a Binary Search Tree 二叉搜索树中插入结点的更多相关文章
- [LeetCode] Search in a Binary Search Tree 二叉搜索树中搜索
Given the root node of a binary search tree (BST) and a value. You need to find the node in the BST ...
- Leetcode501.Find Mode in Binary Search Tree二叉搜索树中的众数
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素). 假定 BST 有如下定义: 结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当 ...
- Leetcode700.Search in a Binary Search Tree二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. class Solution { public: ...
- LeetCode701 二叉搜索树中插入结点
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜 ...
- LeetCode Recover Binary Search Tree——二查搜索树中两个节点错误
Two elements of a binary search tree (BST) are swapped by mistake.Recover the tree without changing ...
- [LeetCode] Delete Node in a BST 删除二叉搜索树中的节点
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...
- [LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
- [LeetCode] 235. Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
- [LeetCode] 235. Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最近公共祖先
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
随机推荐
- 第十三节: EF的三种模式(三) 之 来自数据库的CodeFirst模式
一. 简介 [来自数据库的Code First模式]实质上并不是CodeFirst模式,而是DBFirst模式的轻量级版本,在该模式中取消了edmx模型和T4模板,直接生成了EF上下文和相应的类,该模 ...
- Java编码中出现的乱码问题
1 让eclipse新建的jsp页面直接默认的就是gb2312 打开Window->Preferences,打开General中的 Content Types,选中Text 这是改全部的TXT的 ...
- SQL Server 跨服务器操作
Ø 简介 在工作中编写 SQL 时经常会遇到跨库或跨服务器操作,比如查询时,通过 A 服务器的某张表关联 B 服务器某张表,进行连接查询.或者从另一台服务器中的数据,对当前数据库中的数据进行 CRU ...
- SSH框架之hibernate《三》
Hibernate03 一.多表设计 1.1多表设计的总则 问题:我们为什么要学习多表映射? 答: ...
- js中的简单数据类型和复杂数据类型的存储
基本类型存储的是值而复杂数据类型也叫引用类型存储的是对象的地址如0x00001而在栈中存的是变量数值和函数参数 堆中存的是对象和数组 堆栈空间分配 栈(操作系统):由操作系统自动分配释放 ,存放函数的 ...
- Nginx--服务部署、基于域名的虚拟主机配置
一.服务部署 1.预处理 安装CentOS ,配置hosts.静态IP.设置必要的安全参数等(略) 1-1.系统环境 [root@vnx ~]# cat /etc/redhat-release Cen ...
- LOJ #556. 「Antileaf's Round」咱们去烧菜吧
好久没更博了 咕咕咕 现在多项式板子的常数巨大...周末好好卡波常吧.... LOJ #556 题意 给定$ m$种物品的出现次数$ B_i$以及大小$ A_i$ 求装满大小为$[1..n]$的背包的 ...
- StringBuffer/StringBuilder总结
- 基于百度API+Flask实现网页版和图灵机器聊天
开发前准备 调用百度和图灵机器人相关的 参考链接:www.cnblogs.com/changtao/p/10596385.html 下载一个网页录音的js插件 链接:https://pan.baidu ...
- jetty启动设置端口
nohup java -jar start.jar jetty.port=10010 命令不能在后台运行,ctrl+c程序就自动停止了,可以在命令后面加个&符号,就可以了 nohup java ...