1. 程式人生 > 實用技巧 >LeetCode450. 刪除二叉搜尋樹中的節點

LeetCode450. 刪除二叉搜尋樹中的節點

☆☆☆思路:二叉搜尋樹的刪除操作是最難的。。。

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        /**
         *  知識點:
         *    1. BST的遞迴模板
         *    2. BST刪除某個節點,可以將其替換為左子樹的最右節點 或者 右子樹的最左節點
         *    3. 刪除BST中最小的節點
         */
        if (root == null) return null;
        if (key < root.val) {
            
// 待刪除節點在左子樹中 root.left = deleteNode(root.left, key); return root; }else if (key > root.val) { // 待刪除節點在右子樹中 root.right = deleteNode(root.right, key); return root; }else { // key = root.val,root 為待刪除節點 if (root.left == null
) { return root.right; }else if (root.right == null) { return root.left; }else { // 左右子樹都存在,返回後繼節點(右子樹最左葉子)作為新的根 TreeNode mostLeft = min(root.right); // 以下兩行順序不能顛倒,否則會出現環路 "mostLeft.right = mostLeft" mostLeft.right = deleteMin(root.right); mostLeft.left
= root.left; return mostLeft; } } } private TreeNode min(TreeNode root) { if (root.left == null) { return root; } return min(root.left); } // 刪除BST中最小的節點 private TreeNode deleteMin(TreeNode root) { if (root.left == null) { return root.right; } root.left = deleteMin(root.left); return root; } }