二叉树(十六):二叉搜索树中的插入操作
程序员文章站
2022-05-16 11:46:25
...
一、二叉搜索树中的插入操作
- 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
插入方法:当不考虑改变树的结构是,只要遍历二叉搜索树,找到空节点,插入元素就可以了
1、递归方法一(使用返回值完成父子节点赋值操作)(推荐)
注意这里通过递归函数返回值完成父子节点赋值操作的技巧
class Solution {
public:
//递归函数返回值为当前节点,参数为当前节点,待插入的值
TreeNode* insertIntoBST(TreeNode* root, int val) {
//迭代终止条件:当前节点为空,说明待插入的值就应该插入到这里,构造节点,返回该节点
if (root == NULL) {
TreeNode* node = new TreeNode(val);
return node;
}
//迭代单层循环,如果当其节点值大于给定值,向左搜索,同时接受递归函数返回的节点作为自己的左孩子,完成父子节点赋值
if (root->val > val) root->left = insertIntoBST(root->left, val);
//迭代单层循环,如果当其节点值小于给定值,向右搜索,同时接受递归函数返回的节点作为自己的由孩子,完成父子节点赋值
if (root->val < val) root->right = insertIntoBST(root->right, val);
return root;
}
};
2、递归方法二(无返回值)
class Solution {
private:
//无返回值时候,需要定义变量记录当前节点的父结点
TreeNode* parent;
void traversal(TreeNode* cur, int val) {
//递归终止条件:如果当前节点为空,通过父结点插入当前节点
if (cur == NULL) {
TreeNode* node = new TreeNode(val);
if (val > parent->val) parent->right = node;
else parent->left = node;
return;
}
//更新父结点
parent = cur;
//根据当前节点与给定值关系,选择递归方向
if (cur->val > val) traversal(cur->left, val);
if (cur->val < val) traversal(cur->right, val);
return;
}
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
parent = new TreeNode(0);
//空树处理
if (root == NULL) {
root = new TreeNode(val);
}
//递归解决问题
traversal(root, val);
return root;
}
};
3、迭代方法
通常是迭代寻找到空节点,并记录当前节点的父结点;当找到空节点后使用父节点插入当前节点
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == NULL) {
TreeNode* node = new TreeNode(val);
return node;
}
TreeNode* cur = root;
TreeNode* parent = root; // 这个很重要,需要记录上一个节点,否则无法赋值新节点
while (cur != NULL) {
parent = cur;
if (cur->val > val) cur = cur->left;
else cur = cur->right;
}
TreeNode* node = new TreeNode(val);
if (val < parent->val) parent->left = node;// 此时是用parent节点的进行赋值
else parent->right = node;
return root;
}
};
上一篇: 7.CSMA协议
下一篇: 生成测试数据工具类 安卓