Java二叉查找树的基本实现

二叉树可分为满二叉树、完全二叉树、平衡二叉树(二叉查找树)、最优二叉树(哈夫曼树),此篇代码实现的是普通二叉查找树。
中序遍历可以实现二叉树存储数据的顺序排序。

package unittest;

import java.util.Arrays;

/**Person类 二叉树存储的数据类型 可比较
 * @author Dylaniou
 *
 */
class Person implements Comparable<Person>{
    
    
	private String name;
	private int age;
	Person(String name,int age){
    
    
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
    
    
		return this.name + "-" + age;
	}
	@Override
	public int compareTo(Person per) {
    
    
		return this.age - per.age;
	}
}

public class RealizeBinaryTree<T extends Person>{
    
    
	private Node root;//一个二叉树有且仅对应一个根节点,通过根节点即可遍历到所有的二叉树节点
	private int count;//计数器,用于记录二叉树存储的数据个数
	Object[] inorderArrayData;//用于存储由二叉树中序遍历后组成的数组
	private int foot;//脚标,用于遍历二叉树时使用
	/**实现二叉树的基本数据结构类
	 * @author Dylaniou
	 */
	private class Node{
    
    
		private Node parent;//父节点
		private Node left;//左子节点
		private Node right;//右子节点
		private Comparable<Person> data;//节点上要存储的数据
		
		Node(Comparable<Person> data){
    
    
			this.data = data;
		}
		
		/**往二叉树中增加后续节点:小于当前节点加入左子树 大于当前节点加入右子树
		 * @param newNode
		 */
		private void addNode(Node newNode){
    
    
			if(newNode.data.compareTo((Person) this.data)<=0){
    
    //小于当前节点加入左子树
				if(this.left==null){
    
    
					this.left = newNode;
				}else{
    
    
					this.left.addNode(newNode);//要加入的位置已存在节点,则递归继续判断
				}
			}else{
    
    //大于当前节点加入右子树
				if(this.right==null){
    
    
					this.right = newNode;
				}else{
    
    
					this.right.addNode(newNode);//要加入的位置已存在节点,则递归继续判断
				}
			}
		}
		
		/**
		 * 中序遍历:左中右
		 */
		public void inorderTraserval(){
    
    
			if(this.left!=null){
    
    
				this.left.inorderTraserval();//只要发现还有左子节点就继续递归
			}
			System.out.println("foot#"+ foot + (inorderArrayData[foot++] = this.data));
			if(this.right!=null){
    
    
				this.right.inorderTraserval();//只要发现还有右子节点就继续递归
			}
		}
	}
	
	/**往二叉树中添加数据 第一个添加的数据形成根节点,后续添加的数据在根节点的基础上,根据二叉树规则,形成二叉树结构
	 * @param data
	 */
	private void add(Comparable<Person> data){
    
    
		if(data == null){
    
    
			throw new NullPointerException("保存的数据不能为空!");
		}
		Node newNode = new Node(data);
		if(this.root == null){
    
    
			this.root = newNode;//第一个添加的数据形成根节点
		}else{
    
    
			this.root.addNode(newNode);//后续添加的数据在根节点的基础上,根据二叉树规则,形成二叉树结构
		}
		count++;
	}
	
	public static void main(String[] args) {
    
    
		RealizeBinaryTree<Person> binaryTree = new RealizeBinaryTree<Person>();
		binaryTree.add(new Person("PersonA",80));
		binaryTree.add(new Person("PersonB",30));
		binaryTree.add(new Person("PersonC",20));
		binaryTree.add(new Person("PersonD",50));
		binaryTree.add(new Person("PersonE",70));
		binaryTree.inorderArrayData = new Object[binaryTree.count];
		binaryTree.root.inorderTraserval();
		System.out.println(Arrays.toString(binaryTree.inorderArrayData));
	}
}

猜你喜欢

转载自blog.csdn.net/u010425839/article/details/107662908