1. 程式人生 > >二叉樹之刪除元素

二叉樹之刪除元素

二叉樹刪除一個節點分兩種情況,

第一種:要刪除的節點有左子樹

第二種:要刪除的節點沒有左子樹

假定有以下的二叉樹資料:


現在需要刪除3這個元素,這屬於第一種情況:需要把待刪除的節點的左子樹下的最右邊的資料給拿出來放到3這個位置

,如果刪除30就是屬於第二種情況了,直接刪除就行了

程式碼如下:

//刪除某個特定元素
function deleteData(data,root){
    var parentNode = null;
    var currentNode = root;
    while(currentNode != null){
        //如果當前節點的值大於data
        if(currentNode.key > data){
            parentNode = currentNode;
            //向左子樹查詢
            currentNode = currentNode.left;
        }else if(currentNode.key < data){
            parentNode = currentNode;
            currentNode = currentNode.right;
        }else{
            break;
        }
    }
    //當前節點
    console.log("currentNode is " + currentNode);
    //父節點
    console.log("parentNode is " + parentNode);
    return deleteElement(currentNode,parentNode);
}
function deleteElement(currentNode,parentNode){
    if(currentNode === null){
        return false;
    }
    //如果當前節點沒有左子樹
    if(currentNode.left === null){
            if(parentNode === null){
                parentNode = currentNode.right;
            }else{
                if(currentNode.key > parentNode.key){
                    parentNode.right = currentNode.right;
                }else{
                    parentNode.left = currentNode.right;
                }
            }
    }else{
        var parentOfRightMost = currentNode;
        var rightMost = currentNode.left;
        while(rightMost.right != null){
            parentOfRightMost = rightMost;
            rightMost = rightMost.right;
        }
        //找到左子樹中最右邊的數字了就是左子樹中的最大值
        currentNode.key = rightMost.key;
        if(parentOfRightMost.right === rightMost){
            parentOfRightMost.right = rightMost.left;
        }else{
            parentOfRightMost.left = rightMost.left;
        }
    }
    return true;
} 
console.log(deleteData(3,root));
preOrder(root);