代码随想录训练营第十九天| LeetCode 235. 二叉搜索树的最近公共祖先 、LeetCode 701.二叉搜索树中的插入操作、LeetCode 450.删除二叉搜索树中的节点

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

题目链接:235. 二叉搜索树的最近公共祖先

思路:二叉搜索树的最近公共祖先比二叉树的最近公共祖先要简单不少。要与BST的特性。如果一个结点的值介于p和q之间那么他就是p和q的最近公共祖先。如果如果一个结点的值大于p和q的值那么p和q就在该结点的左子树。如果如果一个结点的值小于p和q的值那么p和q就在该结点的右子树。按照次逻辑就很好写了。

具体实现:

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

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

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

思路:本题比较简单 直接看代码就行

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

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

题目链接:450.删除二叉搜索树中的节点

思路:删除要分情况讨论。当删除的为叶子结点,直接就删了,返回值为null,当删除的结点左子树为空右子树不为空,返回右子树。当删除的结点右子树为空左子树不为空,返回左子树。当删除的结点既有左子树又有右子树。可以让该结点的右孩子来占的他为位子。把他的左孩子的整棵左子树挂到该中序遍历该节点左孩子的后继节点上。中序遍历该节点左孩子的后继节点就是该结点的右孩子的最左下的结点。

具体实现:

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if (root==null){
            return null;
        }
        if (root.val == key){
            if (root.left == null && root.right == null){
                return null;
            }
            if (root.left==null && root.right!=null){
                return root.right;
            }

            if (root.left!=null && root.right==null){
                return root.left;
            }

            if (root.left!=null && root.right!=null){
                TreeNode cur = root.right;
                //找到该结点的右孩子的最左下的结点
                while (cur.left!=null){
                    cur = cur.left;
                }
                //将该结点的右子树挂到右孩子的最左下的结点上去
                cur.left = root.left;
                return root.right;
            }

        }
        if (root.valkey){
            root.left = deleteNode(root.left,key);
        }

        return root;
    }
}

你可能感兴趣的:(java,算法,数据结构)