【二叉树算法题记录】701. 二叉搜索树中的插入操作

题目描述

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果

题目分析

递归法

这题简单起见,我们就在叶子处添加节点即可。因为题目已经规定了是二叉搜索树,所以我们可以很方便地确定遍历的方向,也即:val如果大于根节点,则向右子树去遍历,如果val小于根节点,则向左子树去遍历。当我们遍历到空节点时,也就是我们该插入节点的位置,然后将这个节点向上传递给该节点作为子树的根节点

整体cpp代码

/**
 * 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) {
        if(root==NULL) {
            TreeNode* node = new TreeNode(val);
            return node;
        }
        if(val < root->val) root->left = insertIntoBST(root->left, val);
        if(val > root->val) root->right = insertIntoBST(root->right, val);
        return root;
    }
};

迭代法

迭代法注意要同时记录一个父节点。

整体cpp代码

/**
 * 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) {
        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; // 如果val小于当前节点值,看左子树
            else cur = cur->right;  // 如果val大于当前节点值,看右子树
        }
        TreeNode* node = new TreeNode(val);
        if(val < parent->val) parent->left = node;
        else parent->right = node;
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值