二叉树(十六):二叉搜索树中的插入操作

一、二叉搜索树中的插入操作

  1. 二叉搜索树中的插入操作
    给定二叉搜索树(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;
    }
};

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值