栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java二叉树删除节点

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java二叉树删除节点

二叉树的删除要考虑三种情况
1.删除的节点是叶子节点2.删除的节点只有一个子树3.删除的节点有两个子树

删除的节点是叶子节点
找到删除的叶子结点tNode
找到目标节点的父节点pNode(考虑是否有父节点)
找到删除节点是父节点的左子树还是右子树
根据前边情况进行删除
右子树:p.rc=null
左子树:p.lc=null

删除的节点只有一个子树
找到删除的叶子结点tNode
找到目标节点的父节点pNode(考虑是否有父节点)
找到删除节点是父节点的左子树还是右子树
确定删除节点是左子树还是右子树
根据前边情况进行删除
tNode是它父节点的左子树
tNode有左子树 : pNode.lc=tNode.lc
tNode有右子树 : pNode.lc=tNode.rc
tNode是是它父节点的右子树
tNode有左子树 : pNode.rc=tNode.lc
tNode有右子树 : pNode.rc=tNode.rc

删除的节点有两个子树
找到删除的叶子结点tNode
找到目标节点的父节点pNode(考虑是否有父节点)
找到删除节点右子树中最小的或找到左子树中最大的
将右子树当中最大的值替换掉删除节点的值
使删除叶子节点的逻辑,删除最小值

//找到要删除的节点
	public TreeNode searchDelnode(TreeNode node,Integer val) {
		if(node==null) {
			return null;
		}
		if(node.val==val) {
			return node;
		}else if(val>node.val){
			if(node.rightNode==null) {
				return null;
			}
			return searchDelnode(node.rightNode, val);
		}else {
			if(node.leftNode==null) {
				return null;
			}
			return searchDelnode(node.leftNode, val);
		}
	}
//找到要删除节点的父节点
	public TreeNode searchDelpartent(TreeNode node,Integer val) {
		if(node==null) {
			return null;
		}
		if((node.leftNode!=null&&node.leftNode.val==val)||(node.rightNode!=null&&node.rightNode.val==val)) {
			return node;
		}else {
			if(node.leftNode!=null&&valnode.val){
				return searchDelpartent(node.rightNode, val);
			}else {
				return null;
			}
		}
	}
//二叉树删除节点
	public void del(TreeNode node,Integer val) {
		if(node==null) {
			return;
		}
		//1.找到要删除的节点
		TreeNode targetNode=searchDelnode(node, val);
		//2.没有找到要删除的节点
		if(targetNode==null) {
			return;
		}
		//3.找到要删除节点的父节点
		TreeNode parentNode=searchDelpartent(node, val);
		if(node.rightNode==null&&node.leftNode==null) {
			root=null;
			return;
		}
		if(parentNode==null&&(targetNode.rightNode!=null||targetNode.leftNode!=null)) {
			int min=searchRightMin(targetNode.rightNode);
			targetNode.val=min;
			return;
		}
		if(targetNode.leftNode==null&&targetNode.rightNode==null) {
			if(parentNode.rightNode!=null&&parentNode.rightNode.val==targetNode.val) {
				parentNode.rightNode=null;
			}else if(parentNode.leftNode!=null&&parentNode.leftNode.val==val){
				parentNode.leftNode=null;
			}
		}else if(targetNode.leftNode!=null&&targetNode.rightNode!=null) {
//在删除节点由左右两个子树时,我们选择找删除节点右子树的最小值,我们可以写一个方法,在这个方法里不仅找到最小值,并把这个位置的元素进行删除
			int min=searchRightMin(targetNode.rightNode);
			targetNode.val=min;
		}else {
			if(targetNode.rightNode!=null) {
				if(parentNode.rightNode.val==targetNode.val) {
					parentNode.rightNode=targetNode.rightNode;
				}else {
					parentNode.leftNode=targetNode.rightNode;
				}
			}else{
				if(targetNode.rightNode.val==targetNode.val) {
					parentNode.rightNode=targetNode.leftNode;
				}else {
					parentNode.leftNode=targetNode.leftNode;
				}
			}
		}
	}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692861.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号