二叉树删除一个节点分两种情况,
第一种:要删除的节点有左子树
第二种:要删除的节点没有左子树
假定有以下的二叉树数据:
现在需要删除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);