树的基本实现

本文详细介绍了树结构的基本概念,包括节点定义、树的创建、查找、插入、删除及中序遍历算法,并通过实例展示了如何在Java中实现这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package tree;

public class Node {
	public int iData;//关键字
	public int dData;//数据
	public Node leftNode;//左孩子
	public Node rightNode;//右孩子
	
	public void displayNode(){
		System.out.println("{ "+iData+", "+dData+"}");
	}

}

package tree;

public class Tree {
	private Node root;//根节点
	
	/**本树是根据关键字来插入的,左孩子的关键字比右孩子的关键字小
	 * 且关键字不会重复*/
	public Tree(){
		root=null;
	}
	
	public Node getRoot() {
		return root;
	}

	public void setRoot(Node root) {
		this.root = root;
	}

	/**根据关键字查找节点,
	 * @param key 关键字*/
	public Node findKey(int key){
		Node current=root;
		if((current==null)&&(current.rightNode==null)){//判断树是否为空
			System.out.println("树为空!");
			return null;
		}
		while(current.iData!=key){
			if(current.iData<key){//往左走
				current=current.leftNode;
			}else{//往右走
				current=current.rightNode;
			}
			if(current==null){
				System.out.println("没有该节点! ");
				return null;
			}
		 }
		
		return current;
	}

	/**插入节点
	 * @param id 关键字
	 * @param dd 数据项*/
	public void insertNode(int id,int dd){
		//判断该关键字是否存在
	/*	Node n=findKey(id);
		if(n!=null){
			return ;//说明关键字已经存在
		}*/
		Node node=new Node();
		node.iData=id;
		node.dData=dd;
		if(root==null){
			root=node;//如果树为空,则该节点就是该树的根节点
			return ;
		}
		Node parent;
		Node current=root;
		while(true){//找到插入的位置
			parent=current;
			if(id<current.iData){
				current=current.leftNode;//往左走
				if(current==null){
					parent.leftNode=node;
					return ;
				}
			}else{
				current=current.rightNode;//往右走
				if(current==null){
					parent.rightNode=node;
					return ;
				}
			}
		}
	}

	/**
	 * 寻找后继节点*/
	public Node getHouJi(Node deletNode){
		Node HouJiParent=deletNode;
		Node HouJi=deletNode;
		Node current=HouJi.rightNode;
		while(current!=null){
			HouJiParent=HouJi;
			HouJi=current;
			current=current.leftNode;
		}
		if(HouJi!=deletNode.rightNode){
			HouJiParent.leftNode=HouJi.rightNode;
			HouJi.rightNode=deletNode.rightNode;
		}
		
		return HouJi;
	}

	/**
	 * 删除一个节点
	 * @param key 元素的关键字*/
	public void deleteNode(int key){
		Node parent=root;//删除节点的父节点
		Node current=root;//删除的节点
		boolean isLefteChild=false;//标记该删除的 元素时parent的左孩子还是右孩子
		while(current.iData!=key){
			parent=current;
			if(key<current.iData){
				//往左走
				current=current.leftNode;
				isLefteChild=true;
			}else{
				//往右走
				current=current.rightNode ;
				isLefteChild=false;
			}
			if(current==null){
				System.out.println("删除失败,没有改节点");
				return;
			}
		}//while
		//如果该节点没有孩子,
		if((current.leftNode==null)&&(current.rightNode==null)){
			if(current==root){
				root=null;
			}
			if(isLefteChild){
				parent.leftNode=null;
				return;
			}else{
				parent.rightNode=null;
				return;
			}
		}
		
		//如果有一个孩子,且为左孩子 
		if((current.rightNode==null)&&(current.leftNode!=null)){
			if(current==root){
				root=root.leftNode;
			}else{
				if(isLefteChild){
					parent.leftNode=current.leftNode;
					return ;
				}else{
					parent.rightNode=current.leftNode;
					return ;
				}
			}
		}

		//如果有一个孩子,且为右孩子 
		if((current.rightNode!=null)&&(current.leftNode==null)){
			if(current==root){
				root=root.rightNode;
			}else{
				if(isLefteChild){
					parent.leftNode=current.rightNode;
					return ;
				}else{
					parent.rightNode=current.rightNode;
					return ;
				}
			}
		}
		
		//如果删除的节点有两个孩子,
		if((current.rightNode!=null)&&(current.leftNode!=null)){
			//找到其后继节点
			Node houJi=getHouJi(current);
			if(current==root){
				root=houJi;
			}else if(isLefteChild){
				parent.leftNode=houJi;
			}else if(!isLefteChild){
				parent.rightNode=houJi;
			}
			houJi.leftNode=current.leftNode;
		}
		
	}
	
	/**
	 * 中序遍历树*/
	public void center(Node root){
		if(root!=null){
			center(root.leftNode);
			System.out.print(root.iData+" ");
			center(root.rightNode);
		}
	}

	public static void main(String args[]){
		Tree tree=new Tree();
		tree.insertNode(5,3);
		tree.insertNode(48,3);
		tree.insertNode(42,3);
		tree.insertNode(32,3);
		tree.insertNode(96,3);
		tree.insertNode(79,3);
		tree.insertNode(3,3);
		tree.insertNode(78,3);
		tree.insertNode(75,3);
		tree.insertNode(25,3);
		tree.insertNode(1,3);
		tree.insertNode(4,3);
		 
		 
		tree.center(tree.getRoot());
		tree.deleteNode(48);
		System.out.println();
		tree.center(tree.getRoot());
		
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值