二叉樹之刪除元素
阿新 • • 發佈:2018-11-12
二叉樹刪除一個節點分兩種情況,
第一種:要刪除的節點有左子樹
第二種:要刪除的節點沒有左子樹
假定有以下的二叉樹資料:
現在需要刪除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);