排序二叉树添加删除java实现


添加比较容易理解,删除在理解具体思路下用了一小时才完成 值的留念下

	private static Node root;
	
	public static void remove(Node n){
		/**
		 * 1、找到对应节点的父节点p,并且判断当前节点是父节点p的左(l) 或 右(r)节点
		 * 2、根据当前节点是否有子节点分3种情况处理
		 * 3、如果左右节点都不为空,那真实删除的节点就是 左边最大 或者 右边最小 的节点,
		 *    然后使用实际删除的节点的值来替换当前节点即可
		 * 4、如果删除的节点是根节点(默认根节点为左节点)  
		 *  
		 */
		boolean isLeft = true;
		Node p = null;
		Node current = root;
		do{
			if(current.data == n.data)
				break;
			else if(current.data > n.data){
				p = current;
				current = current.left;
				isLeft = true;
			}else if(current.data < n.data){
				p = current;
				current = current.right;
				isLeft = false;
			}
		}while(current != null);
		if(current != null){
			Node l = current.left;
			Node r = current.right;
			if(l == null && r == null){
				if(isLeft)
					p.left = null;
				else
					p.right = null;
			}else if(l == null){
				current.right = null;
				if(isLeft)
					p.left = r;
				else
					p.right = r;
			}else if(r == null){
				current.right = null;
				if(isLeft)
					p.left = l;
				else
					p.right = l;
			}else{
				Node needReplace = current;
				if(isLeft){
					current = current.right;
					while(current.left != null)
						current = current.left;
				}else{
					current = current.left;
					while(current.right != null)
						current = current.right;
				}
				remove(current);
				needReplace.data = current.data;
			}
		}
	}
	
	public static void main(String[] args) {
		int[] arr = {29,5,37,1,25,31,40,15,26,30,36,20,35,17,32,18,33,19,34};
		for(int i : arr)
			add(i);
		levelTravel(root);
		remove(new Node(370)); // 如果有兴趣可以多换几个数字测试下,25 ,31是比较复杂的删除
		System.out.println();
		levelTravel(root);
	}
	
	static class Node{
		int data;  
        Node left;  
        Node right; 
        public Node(int data) {  
            this.data = data;  
        }  
        public String toString(){  
            return "[data=" + data + "]";  
        }  
	}

	
	public static void add(int ele){
		if(root == null)
			root = new Node(ele);
		else{
			Node current = root,
				  p = null;
			int d = 0;
			do{
				p = current;
				d = ele - current.data;
				if(d > 0)
					current = current.right;
				else if(d < 0)
					current = current.left;
				else
					return ;
			}while(current != null);
			Node n = new Node(ele);
			if(d > 0)
				p.right = n;
			else
				p.left = n;
		}
	}
	
	public static void levelTravel(Node root){
		int h = 0, r = 0;
		Node[] arr = new Node[100];
		arr[r++] = root;
		while(h<r){
			Node n = arr[h++];
			System.out.print(n.data+" ");
			if(n.left != null)
				arr[r++]=n.left;
			if(n.right != null)
				arr[r++]=n.right;
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值