LeetCode450. 刪除二叉搜尋樹中的節點
阿新 • • 發佈:2020-12-26
☆☆☆思路:二叉搜尋樹的刪除操作是最難的。。。
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; } }