欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-16 11:46:25
...

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

  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;
    }
};