数据结构--二叉树

一 。二叉树的性质

二 。二叉树的实现

 

public class Node {
	public int data;
	public String sData;
	public Node leftChild;
	public Node rightChild;
	
	public Node(int data,String sData){
		this.data=data;
		this.sData=sData;
	}
}

public class BinaryTree {
	//根节点
	public Node root;
	
	
	/**
	 * 插入节点
	 * @param val
	 */
	public void insert(int val,String s){
		Node newNode=new Node(val,s);
		Node cur=root;
		//引用父节点
		Node parent;
		if(root==null){
			root=newNode;
			return;
		}else{
			while(true){
				parent=cur;
				//当前节点比插入的数要大
				if(cur.data>val){
					cur=cur.leftChild;
					if(cur==null){
						parent.leftChild=newNode;
						return;
					}
				}else{
					cur=cur.rightChild;
					if(cur==null){
						parent.rightChild=newNode;
						return;
					}
				}
			}
		}
	}
	
	/**
	 * 
	 * 查找节点
	 */
	public Node find(int val){
		Node cur=root;
		//循环,只要查找值不等于当前节点的数据项
		while(cur.data != val){
			if(cur.data>val){
				cur=cur.leftChild;
			}else{
				cur=cur.rightChild;
			}
			if(cur==null){
				return null;
			}
		}
		return cur;
	}
	
	/**
	 * 删除节点
	 * 
	 * 二叉树的删除是比较复杂的操作
	 *     被删除的节点是叶子节点               	度=0
	 *     被删除的节点只有 左孩子节点      	度=1
	 *     被删除的节点只有 右孩子节点	   	 度=1
	 *     被删除的节点  有两个孩子节点    	度=2
	 */
	public boolean delete(int val){
		Node cur=root;
		Node parent=root;
		boolean isLeftChild=true;
		while(cur.data !=val){
			if(cur.data > val){
				parent=cur;
				cur=cur.leftChild;
				isLeftChild=true;
			}else{
				cur=cur.rightChild;
				isLeftChild=false;
			}
			if(cur==null) return false;
		}
		
		//删除叶子节点  没有子节点 度=0
		if(cur.leftChild==null && cur.rightChild==null){
			if(cur==root){
				root=null;
			}else if(isLeftChild){
				parent.leftChild=null;
			}else{
				parent.rightChild=null;
			}
		
		//被删除的节点只有 左孩子节点
		if(cur.rightChild==null)
			if(cur==root){
				root=cur.leftChild;
				
			}else if(isLeftChild){
				parent.leftChild=cur.leftChild;
				
			}else{
				parent.rightChild=cur.leftChild;
				
			}
		}
		
		//被删除的节点只有 右孩子节点  左子节点不存在
		if(cur.leftChild==null){
			if(cur==root){
				root=cur.rightChild;
			}else if(isLeftChild){
				parent.leftChild=cur.rightChild;
			}else{
				parent.rightChild=cur.rightChild;
			}
		}
		
		// 被删除的节点  有两个孩子节点
		if(cur.leftChild !=null && cur.rightChild !=null){
			Node success=getSuccess(cur);
			if(cur==root){
				root=success;
			}else if(isLeftChild){
				parent.leftChild=success;
			}else{
				parent.rightChild=success;
			}
			success.leftChild=cur.leftChild;
		}
		return true;
	}
	
	public Node getSuccess(Node delNode){
		Node suc=delNode;
		Node sucParent=delNode;
		Node cur=delNode.rightChild;
		
		while(cur != null){
			sucParent=suc;
			suc=cur;
			cur=cur.leftChild;
		}
		if(suc !=delNode.rightChild){
			sucParent.leftChild=suc.rightChild;
			suc.rightChild=delNode.rightChild;
		}
		return suc;
	}
	
	
	
	
	/**
	 * 前序遍历  根左右
	 */
	public void preOrder(Node node){
		if(node != null){
			System.out.print(node.data+","+node.sData+" ");
			preOrder(node.leftChild);
			preOrder(node.rightChild);
		}
	}
	
	/**
	 * 中序遍历  左根右
	 */
	public void inOrder(Node node){
		if(node !=null){
			inOrder(node.leftChild);
			System.out.print(node.data+","+node.sData+" ");
			inOrder(node.rightChild);
		}
	}
	
	/**
	 * 后序遍历  左右根
	 */
	public void afterOrder(Node localNode) {
		if(localNode != null) {
			//后序遍历左子树
			afterOrder(localNode.leftChild);
			//后序遍历右子树
			afterOrder(localNode.rightChild);
			//访问根节点
			System.out.print(localNode.data+","+localNode.sData+" ");
		}
	}
}
public class TestTree {
	public static void main(String[] args) {
		BinaryTree tree=new BinaryTree();
		
		tree.insert(10, "jane");
		tree.insert(20, "can");
		tree.insert(5, "youku");
		tree.insert(15, "do");
		tree.insert(30, "macop");
		tree.insert(40, "maciop");
		
		System.out.println(tree.root.data);
		System.out.println(tree.root.rightChild.data);
		System.out.println(tree.root.leftChild.data);
		System.out.println(tree.root.rightChild.leftChild.data);
		
		Node node=tree.find(5);
		System.out.println(node.data+","+node.sData);
		
		
		//遍历
		tree.afterOrder(tree.root);
		System.out.println();
		
		tree.delete(15);
		tree.afterOrder(tree.root);
	}
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值