二叉树_题目31:701. 二叉搜索树中的插入操作

47 阅读3分钟

题目31:701. 二叉搜索树中的插入操作

701. 二叉搜索树中的插入操作

同类题目

前置知识

二叉搜索树(Binary Search Tree) :也叫做二叉查找树、有序二叉树或者排序二叉树。是指一棵空树或者具有下列性质的二叉树:

  • 如果任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。
  • 如果任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。
  • 任意节点的左子树、右子树均为二叉搜索树。

题目描述

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

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

    示例 1:

     输入:root = [4,2,7,1,3], val = 5
     输出:[4,2,7,1,3,5]
     解释:另一个满足题目要求可以通过的树是:
    

    示例 2:

     输入:root = [40,20,60,10,30,50,70], val = 25
     输出:[40,20,60,10,30,50,70,null,null,25]
    

    示例 3:

     输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
     输出:[4,2,7,1,3,5]
    

    提示:

    • 树中的节点数将在 [0, 104]的范围内。
    • -108 <= Node.val <= 108
    • 所有值 Node.val独一无二 的。
    • -108 <= val <= 108
    • 保证 val 在原始BST中不存在。

思路分析

迭代

对于二叉搜索,插入节点的步骤如下

  • 如果二叉搜索树为空,则创建一个值为val的节点,并将其作为二叉搜索树的根节点。

  • 如果二叉搜索树不为空,则将待插入的值val 与二叉搜索树根节点的值root->val进行比较

    • 如果 val < cur->val,则cur = cur->left
    • 如果 val > cur->val,则cur = cur->right

程序代码

方法一

 // https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/
 // 235. 二叉搜索树的最近公共祖先
 ​
 #include<iostream>
 #include<vector>
 using namespace std;
 ​
 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* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
         while(root)
         {   
             // 如果pq的值都大于root的值,那么要找的节点在右子树中 
             if(p->val > root->val && q->val > root->val)
             {
                 root = root->right;
             }
             // 如果pq的值都小于root的值,那么要找的节点在左子树中 
             else if(p->val < root->val && q->val < root->val)
             {
                 root = root->left;
             }else
             {
                 // 否则,说明pq分别在root的两侧
                 break;
             }
         }
         return root;
     }
 };

复杂度分析

时间复杂度O(N),一共有 N个节点,最坏情况下,每个节点都要遍历一次。

空间复杂度O(1)

思路分析

递归

对于二叉搜索,插入节点的步骤如下

  • 如果二叉搜索树为空,则创建一个值为val的节点,并将其作为二叉搜索树的根节点。

  • 如果二叉搜索树不为空,则将待插入的值val 与二叉搜索树根节点的值root->val进行比较

    • 如果 val<root->val,则递归将值为val的节点插入到左子树中。
    • 如果 val>root->val,则递归将值为val的节点插入到右子树中。

程序代码

方法二

 class Solution {
 public:
     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
         if (root->val < p->val && root->val < q->val)
             return lowestCommonAncestor(root->right, p, q);
         if (root->val > p->val && root->val > q->val)
             return lowestCommonAncestor(root->left, p, q);
         return root;
     }
 };

复杂度分析

时间复杂度O(N),一共有 N个节点,最坏情况下,每个节点都要遍历一次。

空间复杂度O(N) , 最差情况下,即树退化为链表时,递归深度达到树的层数 N

更多相关知识:github.com/pingguo1987…