Java 构建二叉查找树

代码参考 --《Java语言程序设计(进阶篇) 第八版》--chapter 二叉查找树


1 构建树节点

public class TreeNode {
	int value;
	TreeNode left;
	TreeNode right;
	public TreeNode(int element) {
		// TODO Auto-generated constructor stub
		value=element;
	}
	
	}

2 构建二叉树结构和基本函数

函数列表:


实现代码:



import java.util.ArrayList;

public class MyTree {
	TreeNode root;
	int size=0;
	public MyTree(){
		
	}
	//将数组中元素添加到树节点
	public MyTree(int[] array){
		for(int i=0;i<array.length;i++)
			insert(array[i]);
	}
	public boolean insert(int element){
		//不允许插入相等的数值
		if(root==null)
		{
			root=new TreeNode(element);
		}
		else
		{
			TreeNode parent=null;
			TreeNode current=root;
			while(current!=null)
			if(element<current.value)
			{
				parent=current;
				current=current.left;
			}
			else if(element>current.value){
				parent=current;
				current=current.right;	
			}
			else {
				return false;
			}
				if(element<parent.value)
					parent.left=new TreeNode(element);
				else
					parent.right=new TreeNode(element);
				
			
		}
		size++;
		return true;
	}
	public boolean search(int element){
		if(root==null) return false;
		else{
			//TreeNode parent=null;
			TreeNode current=root;
			while(current!=null){
				if(element>current.value)
					{
					//parent=current;
					current=current.right;
					}
				else if(element<current.value){
					//parent=current;
					current=current.left;
				}
				else {
					return true;
				}
					}
			
		}
		return false;
		
	}
    public void inorder(TreeNode tRoot){
    	TreeNode current=tRoot;
    	if(current==null)
    		return;	
    	else{
    			inorder(current.left);
    			System.out.print(current.value+" ");
    			inorder(current.right);  
    	}
    	
    }
    public void preorder(TreeNode tRoot){
    	TreeNode current=tRoot;
    	if(tRoot==null)
    		return;
    	System.out.print(current.value+" ");
    	preorder(current.left);
		
		preorder(current.right);
    	}
    	
    public void postorder (TreeNode tRoot) {
    	TreeNode current=tRoot;
    	if(current==null)
    		return;
    	else{
    			postorder(current.left);
    			
    			postorder(current.right);
    			System.out.print(current.value+" ");
    		}
    		
    	}
		
	
    public ArrayList<TreeNode> path (int element){
    	//返回从根节点到该节点的路径
    	ArrayList<TreeNode> arrayList=new ArrayList<TreeNode>();
    	TreeNode current=root;
    	if(current==null)
    		return null;
    	else{
    		while(current!=null){
    			if(element==current.value)
    				{
    				//arrayList.add(current);
    				break;
    				}
    			else if(element>current.value){
    				arrayList.add(current);
    				current=current.right;
    			}
    			else{
    				arrayList.add(current);
    				current=current.left;
    				
    			}
    			
    		}
    		
    	}
		return arrayList;
    	
    	
    }

    public boolean deleNode(int element){
    	TreeNode parent=null;
    	TreeNode current=root;
    	while(current!=null){
    		if(element<current.value)
    		{
    			parent=current;
    			current=current.left;
    		}
    		else if(element>current.value)
        		{
        			parent=current;
        			current=current.right;
        		}
    		else break;
    	
    	}
    	//查不到该节点时候,(或者树为空时候)直接返回false
    	if(current==null)
    		return false;
    	//case1:当删除节点的左子树为空时候	
    	if(current.left==null){
    		if(parent==null)
    			root=current.right;
    		else {
    			if(element<parent.value)
    				parent.left=current.right;
    			if(element>parent.value)
    				parent.right=current.right;
    			
    		}
    	}
    	//case2:删除节点存在左子树;
    	else{
    		TreeNode rightMost_father=current;
    		TreeNode rightMost=current.left;
    		//rightmost 是current节点左子树中最大的右节点,且该节点没有右子数了
    		while(rightMost.right!=null)
    			{
    			  rightMost_father=rightMost;
    			  rightMost=rightMost.right;
    			}
    		current.value=rightMost.value;
    		if(rightMost_father.right==rightMost)
    		rightMost_father.right=rightMost.left;
    		else
    			rightMost_father.left=rightMost.left;
    		
    				
    		
    	}
    		
   size--; 	
    	
		return true;
    	
    }

}
3 测试函数

package offerExam;

import java.util.ArrayList;

public class TestTree {
	//测试函数一定要写main 函数呀  !!!
	public static void main(String[] args){
		MyTree tree=new MyTree();
		tree.insert(60);
		tree.insert(55);
		tree.insert(100);
		tree.insert(45);
		tree.insert(57);
		tree.insert(67);
		tree.insert(107);
		tree.insert(59);
		tree.insert(101);
		//测试遍历函数
		System.out.println("测试遍历1:");
		System.out.println(" inorder:");
		tree.inorder(tree.root);
		System.out.println("\n preOrder:");
		tree.preorder(tree.root);
		System.out.println("\n postorder:");
		tree.postorder(tree.root);
		System.out.println();
		//测试查找函数
		int num=56;
		System.out.println(num+"  is in the tree? "+(tree.search(num)?true:false));
		//测试路径函数(path)
		int node_element=107;
		ArrayList<TreeNode> arrayList=tree.path(node_element);
		System.out.println("从根节点到 数值 "+node_element+" 路径是:");
		for(int i=0;arrayList!=null&&i<arrayList.size();i++){
			//此处对返回列表是不是为null 的判断。
			System.out.print(arrayList.get(i).value+" ");
		}
		System.out.println();
		tree.deleNode(100);
		System.out.println("测试删除树种节点100,并将结果用中序遍历");
		tree.inorder(tree.root);
		
		
		
		
		
		//测试用数组初始化树结构
		int[] array={60,55,100,45,57,67,107,59,101};
		MyTree tree2=new MyTree(array);
		System.out.println("\n 测试遍历2:");
		System.out.println(" inorder:");
		tree2.inorder(tree2.root);
		System.out.println("\n preOrder:");
		tree2.preorder(tree2.root);
		System.out.println("\n postorder:");
		tree2.postorder(tree2.root);
	
		
	}
	
	


}


运行结果

测试遍历1:
 inorder:
45 55 57 59 60 67 100 101 107 
 preOrder:
60 55 45 57 59 100 67 107 101 
 postorder:
45 59 57 55 67 101 107 100 60 
56  is in the tree? false
从根节点到 数值 107 路径是:
60 100 
测试删除树种节点100,并将结果用中序遍历
45 55 57 59 60 67 101 107 
 


测试遍历2:
 inorder:
45 55 57 59 60 67 100 101 107 
 preOrder:
60 55 45 57 59 100 67 107 101 
 postorder:
45 59 57 55 67 101 107 100 60 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉查找树是一种具有特定性质和规则的二叉树。它要么是一棵空树,要么满足以下条件:如果它的左子树不为空,则左子树上所有节点的值都小于根节点的值;如果它的右子树不为空,则右子树上所有节点的值都大于根节点的值;同时,它的左子树和右子树也都是二叉查找树。通过这种特性,二叉查找树可以用来进行高效的查找操作。 在二叉查找树中,查询成绩的操作可以通过比较目标成绩与根节点的值来进行。如果目标成绩小于根节点的值,则继续在左子树中进行查找;如果目标成绩大于根节点的值,则继续在右子树中进行查找。通过不断比较和移动,最终可以找到目标成绩所对应的节点。 需要注意的是,二叉查找树的查询效率取决于树的结构。当二叉查找树退化成链状时,查询效率将下降到与顺序查找相同的量级。因此,在构建二叉查找树时,需要尽量保持树的平衡,以提高查询效率。 引用\[1\]提到了二叉排序树的查询步数不会超过树的最大深度,而引用\[2\]则介绍了二叉查找树相对于链表和数组的高效查找方式。因此,通过构建合适的二叉查找树,可以实现对成绩的高效查询操作。 #### 引用[.reference_title] - *1* [(十三)数据结构动态查找之二叉排序树查找](https://blog.csdn.net/qq_45849888/article/details/104301071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [java实现二叉查找树](https://blog.csdn.net/blue_x2/article/details/120681747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值