首页 > 其他分享 >leetcode刷题day19|二叉树Part07(235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点)

leetcode刷题day19|二叉树Part07(235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点)

时间:2024-09-16 21:19:43浏览次数:3  
标签:TreeNode val root 二叉 搜索 孩子 return 树中 节点

235. 二叉搜索树的最近公共祖先

思路:二叉搜索树首先考虑中序遍历。根据二叉搜索树的特性,如果p,q分别在中间节点的左右两边,该中间节点一定是最近公共祖先,如果在同一侧,则递归这一侧即可。

递归三部曲:
1、传入参数:根节点,p,q,返回节点。
2、终止条件:因为p,q一定存在,所以不会遍历到树的最底层,因此可以不写终止条件
3、递归逻辑:如果p,q均小于root的值,递归调用左子树;如果p,q均大于root的值,递归调用右子树。否则直接返回root。

代码如下:

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

该题使用迭代也比较简单,和递归同样的逻辑。代码如下:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode node=root;
        while(node!=null){
            if(p.val<node.val && q.val<node.val) node=node.left;
            else if(p.val>node.val && q.val>node.val) node=node.right;
            else return node;
        }
        return null;
    }
}

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

思路:中序遍历递归。如果要插入的值小于节点值,遍历左子树;反之右子树,当遍历到空值的时候将节点插入。

递归三步曲:
1、传入参数:根节点,要插入的值。
2、终止条件:如果树为空,直接返回插入的节点。
3、递归函数逻辑:如果要插入的值小于节点值,递归调用左子树,并将返回值赋给当前节点的左孩子;右子树亦然。

代码如下:

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root==null) return new TreeNode(val);
        if(val<root.val){
            root.left=insertIntoBST(root.left,val);
        }else{
            root.right=insertIntoBST(root.right,val);
        }
        return root;
    }
}

迭代方法需要记录父节点,也比较简单。代码如下:

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root==null) return new TreeNode(val);
        TreeNode pre=null;
        TreeNode node=root;
        while(node!=null){
            pre=node;
            if(val<node.val){
                node=node.left;
            }else{
                node=node.right;
            }
        }
        if(val>pre.val) pre.right=new TreeNode(val);
        else pre.left=new TreeNode(val);
        return root;
    }
}

450.删除二叉搜索树中的节点

思路:中序遍历递归二叉搜索树,先找到目标值的节点,需要定义全局变量记录前一个节点,如果目标节点为前一个节点的左孩子且左孩子的左孩子不是空,将前一个节点的左孩子指向目标节点的左孩子,目标节点的左孩子的右孩子为目标节点的右孩子,否则指向右孩子;如果目标节点为前一个节点的右孩子且右孩子的右孩子不是空,将前一个节点的右孩子指向目标节点的右孩子,目标节点的右孩子的左孩子为目标节点的左孩子,否则指向左孩子。递归主要用来找到目标节点。

递归三步曲:
1、传入参数:根节点和删除的目标值,返回值为树的某一个节点;
2、终止条件:如果节点为空,返回root;
3、递归函数逻辑:如果目标值小于节点值,递归左子树,返回值传给当前节点的左孩子;如果目标值大于节点值递归右子树,返回值传给当前节点的右孩子。如果目标值等于当前节点值,有五种删除节点的情况:

  • 第一种情况:没找到删除的节点,遍历到空节点直接返回了
    找到删除的节点
  • 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
  • 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
  • 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
  • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

代码如下:

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root==null) return root;
        if(key==root.val){
            if(root.left==null){
                return root.right;
            }else if(root.right==null){
                return root.left;
            }else{
                TreeNode cur=root.right;
                while(cur.left!=null){
                    cur=cur.left;
                }
                cur.left=root.left;
                return root.right;
            }
        }
        if(key<root.val) root.left=deleteNode(root.left,key);
        if(key>root.val) root.right=deleteNode(root.right,key);
        return root;
    }
}

标签:TreeNode,val,root,二叉,搜索,孩子,return,树中,节点
From: https://blog.csdn.net/m0_51007517/article/details/142289935

相关文章

  • 搜索 DFS深度优先搜索
    洛谷P1363幻象迷宫这种恶魔样例究竟是哪个天才想出来的?!!!!!!620#.##.##.##.##.##.##.#.##.##.##.##.##.##.#.##.##.##.##.##.##.S.#..#..#..#..#..#..##..#..#..#..#..#..##..#..#..#..#..#..##md,交了好几发都没过,看了一下这个样例,心都凉了。能想出来这题解的更是天才Orz......
  • 代码随想录算法 - 二叉树6
    题目1235.二叉搜索树的最近公共祖先给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”例如......
  • Day16 二叉树part06| LeetCode 530.二叉搜索树的最小绝对差 ,501.二叉搜索树中的众数,23
    530.二叉搜索树的最小绝对差530.二叉搜索树的最小绝对差classSolution{publicList<Integer>res=newArrayList<>();voidtraversal(TreeNoderoot){if(root==null)return;traversal(root.left);......
  • 搜索
    1、BFS广度优先搜索一般用于地图的搜索遍历,最短路中的SPFA也是洛谷P1126机器人搬重物<1>对于面对方向的计算设四个方向分别为0,1,2,3转向的时候只需要(原方向代号+4±1)%4就可以得到转向后面对的新方向<2>对于每种状态,构建hash,在每次走后判断该种情况是否已经出现......
  • Day15 二叉树part05| LeetCode 654.最大二叉树,617.合并二叉树 ,700.二叉搜索树中的搜索
    654.最大二叉树654.最大二叉树classSolution{publicTreeNodeconstructMaximumBinaryTree(int[]nums){if(nums.length==1)//遍历到了叶子节点{returnnewTreeNode(nums[0]);}intmaxValue=nums[0......
  • Java-数据结构-二叉树-习题(二) (´▽`)ノ
    文本目录:❄️一、习题一(分层遍历):   ▶ 思路:    ▶代码:❄️二、习题二(二叉树的最近公共祖先):    ▶ 思路: ▶代码: ❄️三、习题三(从前序和中序遍历序列中构造二叉树):     ▶ 思路:  ▶代码:❄️四、习题四(从中序和后序遍历序列中构造二......
  • 使用 O(1) 额外内存删除二叉树
    这是一个naive的做法:voiddeleteTreeRec(TreeNode*root){if(root==NULL)return;deleteTreeRec(root->left);deleteTreeRec(root->right);cout<<"Deletingnode"<<root->data<<endl;deleteroot;}O(1)空......
  • 力扣热题100 - 二叉树:二叉搜索树中第 K 小的元素
    题目描述:题号:230给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从1开始计数)。解题思路:思路一:中序遍历二叉树+ 计数根据二叉搜索树的性质,中序遍历得到的节点的顺序是从小到大递增的。所以可以一边中序遍历,一边计数......
  • PanSoo盘搜,百度网盘、阿里云盘、夸克网盘、迅雷网盘UC网盘资源搜索神器-2024年好用的
    ......
  • 力扣热题100 - 二叉树:二叉树展开为链表
    题目描述:题号:114给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。解题思路:思路一:前序遍历后......