java 二叉树(九)删除二叉树中的某一个节点

我们首先看一下删除一个不是根节点的节点牵涉到几个节点:


删除E后


现在需要删掉E

需要 E的父节点

,以A为根节点的最大节点(上一篇讲过获取B节点)

AE的左孩子

FE的右孩子

 

思路如下:首先考虑删除的是不是根节点,在考虑删除的是树中的某一个节点。

当删除的是根节点的时候,仅需要把其左子树中的最大值节点Node放到根节点,然后把Node的左孩子指向根节点的左孩子,把Node的右孩子指向根节点的右孩子即可。

当删除的不是根节点的时候:

被删除节点:E

E的父节点Q

E的左孩子为根节点的最大节点 B

先考虑被删除的节点是否既有左孩子又有右孩子

被删除的节点E是否是其父节点Q的左孩子或右孩子,

E若是Q的左孩子,Q的左孩子指向B,B的左孩子指向A;B的右孩子指向F;即可

若被删除的节点没有右孩子F

需要Q-->B---A。即可

若被删除的没有左孩子A

需要Q-->F  即可

 

代码如下:

//删除树中的一个节点,用被删除节点的孩子补上,不能破坏二叉树的排序规律:左孩子始终小于右孩子
	public void delSort(Object obj){
		Node temp;
		Node node=parent(obj);
		

		if((temp=findNode(obj))!=null){
			//如果删除的是根节点,就让其左子树的最大值放在根节点
			if(root.data.value==temp.data.value){
				Node node1=delFind(temp.getLeftChild());
				node1.setLeftChild(root.getLeftChild().getLeftChild());
				node1.setRightChild(root.getRightChild());
				root=node1;
				
			}else{
			if(temp.getLeftChild()==null&&temp.getRightChild()==null){
				//如果要删除的节点没有左和右孩子,则找到被删除节点的父节点,让其父节点的左孩子指向或右孩子指向置空,即删除
				if(node.data.value<obj.value){//要删除节点是父节点的右孩子
					node.setRightChild(null);//置空删除右孩子
				}else if(node.data.value>obj.value){//要删除节点是父节点的左孩子
					node.setLeftChild(null);//置空删除
				}
			}else if(temp.getLeftChild()!=null&&temp.getRightChild()!=null){
				/*
				 * 若左右孩子都不为空,则从要删除节点的右子树上取最小值放到被删除节点上即可,并把右子树上的最小值删除
				 * 			Q
				 *         /
				 * 		  E 
				 * 		 / \
				 * 		A   F
				 *     / \
				 *    D   B
				 * 	      /
				 * 	     C
				 * 此时若删除E,则首先找到E的父节点Q和E的所有子孙中的最大节点B,
				 * 然后让Q指向B,B的左孩子指向A,B的右孩子指向F,最后把E置空释放空间;
				 * 
				 * 			Q
				 *         /
				 * 		  B 
				 * 		 / \
				 * 		A   F
				 *     / \
				 *    D   C
				 * 	 E=null 释放掉      
				 * 	     
				 * 
				 */
				Node node1=delFind(temp.getLeftChild());
				if(node.data.value<obj.value){//要删除节点是父节点的右孩子
					
					//取被删除节点的左孩子中的最大值,让父节点的右孩子指向被删除节点的左孩子中的最大值;若被删除节点的左孩子中的最大值等于被删除节点的左孩子的值 则让父节点的右孩子指向被删除节点的左孩子
					if(temp.getLeftChild().data.value==node1.data.value){
						node.setRightChild(temp.getLeftChild());
						temp.getLeftChild().setRightChild(temp.getRightChild());
						temp=null;
					}else{
						node.setRightChild(node1);
						node1.setLeftChild(temp.getLeftChild());
						node1.setRightChild(temp.getRightChild());
						temp=null;						
					}
				}else if(node.data.value>obj.value){//要删除节点是父节点的左孩子
					if(temp.getLeftChild().data.value==node1.data.value){
						node.setLeftChild(temp.getLeftChild());
						temp.getLeftChild().setRightChild(temp.getRightChild());
						temp=null;
					}else{
						node.setLeftChild(node1);
						node1.setLeftChild(temp.getLeftChild());
						node1.setRightChild(temp.getRightChild());
						temp=null;						
					}	
				}

				
			}else if(temp.getLeftChild()!=null&&temp.getRightChild()==null){//左孩子不为空右孩子为空的情况,则把要删除节点的左孩子放到被删除节点上即可																	
				if(node.data.value<obj.value){//要删除节点是父节点的右孩子					
					node.setRightChild(temp.getLeftChild());//要删除节点的父节点的右孩子指向为被删除节点的左孩子,并把被删除节点的左指向置空,即删除
					temp=null;
				}else if(node.data.value>obj.value){//要删除节点是父节点的左孩子
					node.setLeftChild(temp.getLeftChild());
					temp=null;					
				}
			}else if(temp.getLeftChild()==null&&temp.getRightChild()!=null){
				//左孩子为空右孩子不为空的情况,则把要删除节点的右孩子放到被删除节点上即可
				if(node.data.value<obj.value){//要删除节点是父节点的右孩子					
					node.setRightChild(temp.getRightChild());//要删除节点的父节点的右孩子指向为被删除节点的左孩子,并把被删除节点的左指向置空,即删除
					temp=null;//删除之后置空,释放空间
				}else if(node.data.value>obj.value){//要删除节点是父节点的左孩子
					node.setLeftChild(temp.getRightChild());
					temp=null;					
				}
				
			}
			}	
		}else{
			System.out.println("你需要删除的节点不存在!");
			//return false;
		}
	}






  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值