Remove Node in Binary Search Tree

Remove Node in Binary Search Tree


今天是一道題目,來自LintCode,難度為Hard,Acceptance為25%

題目如下


Given a root of Binary Search Tree with unique value for each node. Remove the node with given value. If there is no such a node with given value in the binary search tree, do nothing. You should keep the tree still a binary search tree after removal.
Example
Given binary search tree:

          5
       /    \
    3          6
 /    \
2       4

Remove 3, you can either return:

          5
       /    \
    2          6
      \
         4

or :

          5
       /    \
    4          6
 /   
2

解題思路及代碼見閱讀原文

回復0000查看更多題目

解題思路


首先,該題在《算法導論》一書中是有的。思路也較為容易理解,關鍵是實現(xiàn)算法時需要注意的各種細節(jié)。

那么下面說明該題的思路:

第一步,當然是找到要刪除的節(jié)點node和它的父節(jié)點parent,這里采用前序遍歷即可。如題目中所說,如果找到了就繼續(xù),否則什么都不做,直接返回。

第二步,就是刪除該node節(jié)點,這里分為兩種情況:

  • node節(jié)點的右子樹不存在。此時,直接用parent節(jié)點的子節(jié)點指向該node節(jié)點的左節(jié)點。

  • node節(jié)點的右子樹存在。此時,需要找到右子樹的最小節(jié)點,用該節(jié)點替換node節(jié)點。

技巧
因為要刪除的節(jié)點可能是根節(jié)點,因此為了算法的通用性,可以首先new一個dummy節(jié)點,該節(jié)點的左節(jié)點指向根節(jié)點,這樣處理起來更為方便。

最后,我們來看代碼。

代碼如下


Java版

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param root: The root of the binary search tree.
     * @param value: Remove the node with given value.
     * @return: The root of the binary search tree after removal.
     */
    public TreeNode removeNode(TreeNode root, int value) {
        TreeNode dummy = new TreeNode(0);
        dummy.left = root;
        
        TreeNode parent = findNode(dummy, root, value);
        TreeNode node;
        if (parent.left != null && parent.left.val == value) {
            node = parent.left;
        } else if (parent.right != null && parent.right.val == value) {
            node = parent.right;
        } else {
            return dummy.left;
        }
        
        deleteNode(parent, node);
        
        return dummy.left;
    }
    
    private TreeNode findNode(TreeNode parent, TreeNode node, int value) {
        if (node == null) {
            return parent;
        }
        
        if (node.val == value) {
            return parent;
        }
        if (value < node.val) {
            return findNode(node, node.left, value);
        } else {
            return findNode(node, node.right, value);
        }
    }
    
    private void deleteNode(TreeNode parent, TreeNode node) {
        if (node.right == null) {
            if (parent.left == node) {
                parent.left = node.left;
            } else {
                parent.right = node.left;
            }
        } else {
            TreeNode temp = node.right;
            TreeNode father = node;
            
            while (temp.left != null) {
                father = temp;
                temp = temp.left;
            }
            
            if (father.left == temp) {
                father.left = temp.right;
            } else {
                father.right = temp.right;
            }
            
            if (parent.left == node) {
                parent.left = temp;
            } else {
                parent.right = temp;
            }
            
            temp.left = node.left;
            temp.right = node.right;
        }
    }
}

關注我
該公眾號會每天推送常見面試題,包括解題思路是代碼,希望對找工作的同學有所幫助

image
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容