二叉树排序树的增删查改超详细讲解

首先我们先了解下什么是二叉树:

   在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。

    简单来说就是一个节点有最多有两个孩子左孩子右孩子,最少可以没有孩子,叫做叶子节点,这样组成的数就叫做二叉树

像这样的树: 

1、插入

当插入一列数的时候如  5,8,22,10,1,3,83,46,0,89,-9,54,13我们按照节点比左孩子大,比右孩子小排列树。

首先把5当作根节点,比较8比5大,放在8的有右节点上,8就是5的右孩子,22比5大,应该放在5的右节点,但是5的右孩子是8,所以22应该和8比较,22比8大放在8的右节点上,所22是8的右孩子,比较后得到的二叉树为:

同理,左后得到的二叉树为:

2、删除

如上图,如果想删除节点22,则删除后需要补充8的右节点,需要用22的左右节点补充,补充完后10,83还要是他的左右节点。

所以这个数一定比10大,比83小。即这个数为 22( 要删除的节点) 的左节点的右子树的最大值或者  22( 要删除的节点)右节点的左子树的最小值。即删除后二叉树为:

以下是 实现代码:

        package linkLearn;

public class TreeNode {//创建一个树类
	
	public TreeNode leftNode;
	
	public TreeNode rightNode;
	public TreeNode preNode;//声明左节点,右节点,父节点
	
	public Integer data;
	
	TreeNode( Integer data){
		this.data=data;
	}

	@Override
	public String toString() {
		return "节点[左节点=" + leftNode + ", 右节点=" + rightNode + ", 值=" + data + "]";
	}

main函数:

package linkLearn;

public class Treebuild {
	
	
	public static void main(String[] args) {
		
		Integer[] a = {5,8,22,10,1,3,83,46,0,89,-9,54,13};
		
		TreeNode root = new TreeNode(a[0]);//数组第一个数设置为根节点
		root.leftNode=null;
		root.rightNode = null;
		for(int i=1 ,length = a.length;i < length;i++) {
			
			insert( a[i], root);

		}
		
		System.out.println(root);
		delete(root,83);
		System.out.println(root);
		search(root,8);
		System.out.println(root);
	}
	
	public static void insert(Integer data, TreeNode node) {
		
		if( data >node.data ) {
			
			TreeNode childNode = new TreeNode(data);
			if( node.rightNode != null ) {
				insert( data, node.rightNode );//
			}else {
				node.rightNode = childNode;
				childNode.preNode =node;
				
			}
			
		}else {
			TreeNode childNode = new TreeNode(data);
			if( node.leftNode != null ) {
				insert( data, node.leftNode );
			}else {
				node.leftNode = childNode;
				childNode.preNode =node;
			}
		}
		
	}
	
public static void delete(TreeNode root,Integer a) {//删除
	     //TreeNode child =null;
	     //child=root.leftNode ;
		if(a>root.data ) {
			
			delete(root.rightNode ,a);	//进行递归操作
		}
		if(a<root.data) {
			
			delete(root.leftNode ,a);
		}
		if(a==root.data ) {
			if(root.leftNode ==null&&root.rightNode ==null) {
				
				if(root.preNode.data >a){
					root.preNode .leftNode=null;
				}else {root.preNode .rightNode=null;}
			
			}
			if(root.leftNode !=null&&root.rightNode ==null||root.leftNode ==null&&root.rightNode !=null) {
				TreeNode child5 =root.preNode ;
				if(child5.data <a) {
					if(root.leftNode ==null) {
						child5.rightNode =root.rightNode ;
					}
					else{
						child5.rightNode  =root.leftNode ;
						
					}
				}else {
					if(root.leftNode ==null) {
						child5.leftNode  =root.rightNode ;
					}
					else{
						child5.leftNode   =root.leftNode ;
						
					}
				}
				
			}
				
			if(root.leftNode !=null&&root.rightNode !=null) {
				TreeNode child2=null;
				TreeNode child3=null;
				TreeNode child4=null;
				child3=root.preNode ;
				child4=root.leftNode  ;
				
				if(root.leftNode .rightNode !=null) {
					while(root.leftNode .rightNode.rightNode !=null) {
						root.leftNode .rightNode =root.leftNode .rightNode.rightNode ;
					}
					   if(root.leftNode .rightNode.leftNode==null) {
						   if(child3.data >a) {
							child3.leftNode =root.leftNode .rightNode;
							child3.leftNode .leftNode =child4 ;
							root.leftNode .rightNode=null;
							}
						   else {
							   child3.rightNode =root.leftNode .rightNode;
								child3.rightNode  .leftNode =child4 ;
								root.leftNode .rightNode=null;
						   }
						} 
						else {
							 if(child3.data >a) {
							child2=root.leftNode .rightNode.leftNode;
							child3.leftNode =root.leftNode .rightNode;
							child3.leftNode .leftNode =child4 ;
							root.leftNode .rightNode=child2 ;
							 }else {
								 child2=root .rightNode.leftNode;
								 child3.rightNode =root.leftNode .rightNode;
								 child3.rightNode .leftNode =child4 ;
									root.leftNode .rightNode=child2 ;
							 }
						}
				}
					
				else{
					if(child3.data >a) {
						child3.leftNode =child4;
						
					}else {
					child3.rightNode =child4;
					}
					}
			}
			}
			
		}
	
	
	
	
	
public static void search(TreeNode root,Integer a) {//查
		
		if(a>root.data ) {
			root.leftNode =null;
			search(root.rightNode ,a);	
		}
		if(a<root.data) {
			root.rightNode =null;
			search(root.leftNode ,a);
		}
		if(a==root.data) {
			root.rightNode =null;
			root.leftNode =null;
		}
	}
	

}

	

对数组进行插入删除查找操作后结果:

 这是二叉树的添加操作后代码输出:

节点[左节点=节点[左节点=节点[左节点=节点[左节点=null, 右节点=null, 值=-9], 右节点=null, 值=0], 右节点=节点[左节点=null, 右节点=null, 值=3], 值=1], 右节点=节点[左节点=null, 右节点=节点[左节点=节点[左节点=null, 右节点=节点[左节点=null, 右节点=null, 值=13], 值=10], 右节点=节点[左节点=节点[左节点=null, 右节点=节点[左节点=null, 右节点=null, 值=54], 值=46], 右节点=节点[左节点=null, 右节点=null, 值=89], 值=83], 值=22], 值=8], 值=5]

由此可以得到:如上的二叉树。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树增删查改是二叉树操作中常见的操作,下面我分别介绍一下。 1. 增加节点: 在二叉树中增加一个节点,需要遵循以下规则: - 如果为空,新节点成为根节点。 - 如果不为空,从根节点开始,比较新节点的值和当前节点的值。 - 如果新节点的值小于当前节点的值,将新节点插入当前节点的左子。 - 如果新节点的值大于当前节点的值,将新节点插入当前节点的右子。 2. 删除节点: 删除节点需要考虑以下几种情况: - 如果要删除的节点是叶子节点(没有子节点),直接删除即可。 - 如果要删除的节点只有一个子节点,将子节点替代要删除的节点。 - 如果要删除的节点有两个子节点,则找到该节点右子中的最小值(或左子中的最大值),用该最小(最大)值替代要删除的节点,并在右子中删除该最小(最大)值所在的节点。 3. 查找节点: 查找节点需要遵循以下规则: - 从根节点开始,比较要查找的值与当前节点的值。 - 如果要查找的值等于当前节点的值,则找到了目标节点。 - 如果要查找的值小于当前节点的值,则在左子中继续查找。 - 如果要查找的值大于当前节点的值,则在右子中继续查找。 - 如果遍历到叶子节点仍未找到目标节点,则说明目标节点不存在。 4. 修改节点: 修改节点需要先查找到目标节点,然后修改该节点的值即可。 希望以上介绍对你有帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值