数据结构——有序二叉树的构建&遍历&查找

树节点

先定义树节点结构,代码如下:

java 复制代码
package tree;

public class TreeNode {
	public int data;
	public TreeNode left;
	public TreeNode right;
	//数据的类型决定数据在内存中的存储形式,
	//这样可以接受本类型的数据
	
	public TreeNode(int data) {
		this.data=data;
	}
	
	public String toString() {
		
		return "TrreNode{"+
				"data="+data+
				",left"+left+
				",right="+right+
				"}";
		
	}
	
}

**注意!**为什么left和right的类型为TreeNode?

因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为TreeNode,用于接受后续一系列操作,保持了结构的一致性。

一、有序二叉树的构建

1、迭代法:
java 复制代码
public void insert(int data) {
		//新建一个节点
		TreeNode newNode=new TreeNode(data);
		if(root==null) {
			root=newNode;
			return;
		}
		TreeNode currentNode=root;
		while(true) {
			if(newNode.data<currentNode.data) {
				if(currentNode.left!=null) {
					currentNode=currentNode.left;
				}else {
					currentNode.left=newNode;
					return;
				}
			}else {
				if(currentNode.right!=null) {
					currentNode=currentNode.right;
				}else {
					currentNode.right=newNode;
					return;
				}
			}
		}	
	}
2、递归法:
java 复制代码
public void insertCircle(int value,TreeNode node) {//递归方式有序二叉树
		   TreeNode temp=new TreeNode(value);
		   if(root==null) {
			  root=temp; 
			  return;
		   }
		   if(node.data<temp.data) {
			   if(node.right==null) {
				   node.right=temp;
				   return;
			   }
			   insertCircle(value,node.right);
		   }else {
			   if(node.left==null) {
				   node.left=temp;
				   return;
			   }
			   insertCircle(value,node.left);
		   }
	   }

二、有序二叉树的遍历

我们采用递归的方式实现。这就要求我们找到递归规律和递归出口。

1、深度优先遍历------栈原理
先序遍历:
java 复制代码
//先序遍历
	public void beforeOrder(TreeNode root) {
		if(root==null) {
			return;
		}
		System.out.println(" "+root.data);
		beforeOrder(root.left);
		beforeOrder(root.right);
	}
中序遍历:
java 复制代码
//中序遍历
		public void inOrder(TreeNode root) {
			if(root==null) {
				return;
			}
			inOrder(root.left);
			System.out.println(" "+root.data);
			inOrder(root.right);
		}
后序遍历:
java 复制代码
//后序遍历
public void afterOrder(TreeNode root) {
			if(root==null) {
				return;
			}
			afterOrder(root.left);
			afterOrder(root.right);
			System.out.println(" "+root.data);
	}
2、广度优先遍历------队列原理
java 复制代码
    public void levelOrder() {
		LinkedList<TreeNode> queue=new LinkedList<>();
		queue.add(root);
		while(!queue.isEmpty()) {
			root=queue.pop();
			System.out.println(root.data+" ");
			if(root.left!=null) {
				queue.add(root.left);
			}
			if(root.right!=null) {
				queue.add(root.right);
			}
		}
	}

三、查询树中的某个值

java 复制代码
//1.查询某个值
	public boolean search(TreeNode root,int value) {
		if (root == null) {
            return false; 
        }
        if (root.data == value) {
            return true; 
        } else if (value < root.data) {
            return search(root.left, value); // 在左子树中继续查找
        } else {
            return search(root.right, value); // 在右子树中继续查找
        }
	}

四、测试

我们创建一个test类

java 复制代码
package tree;

public class test {

	public static void main(String[] args) {
		BinaryTree binaryTree=new BinaryTree();
		
		binaryTree.insert(5);
		binaryTree.insert(4);
		binaryTree.insert(2);
		binaryTree.insert(0);
		binaryTree.insert(3);
		binaryTree.insert(7);
		binaryTree.insert(6);
		System.out.println(binaryTree.root);
		
		System.out.println(binaryTree.search(binaryTree.root, 5));
		System.out.println(binaryTree.search(binaryTree.root, 9));
		
		BinaryTree binaryTree2=new BinaryTree();
		binaryTree2.insertCircle(5,binaryTree2.root);
		binaryTree2.insertCircle(4,binaryTree2.root);
		binaryTree2.insertCircle(2,binaryTree2.root);
		binaryTree2.insertCircle(0,binaryTree2.root);
		binaryTree2.insertCircle(3,binaryTree2.root);
		binaryTree2.insertCircle(7,binaryTree2.root);
		binaryTree2.insertCircle(6,binaryTree2.root);
		System.out.println(binaryTree2.root);
		
	}
	
	
	
}

结果如下:

相关推荐
乌萨奇也要立志学C++2 分钟前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
老鼠只爱大米11 分钟前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
专注VB编程开发20年12 分钟前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
(>_<)16 分钟前
java minio 分片上传工具类与测试demo
java·minio·分片上传
不想打工的码农16 分钟前
MyBatis-Plus多数据源实战:被DBA追着改配置后,我肝出这份避坑指南(附动态切换源码)
java·后端
Dovis(誓平步青云)25 分钟前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
Coder_Boy_31 分钟前
Deeplearning4j+ Spring Boot 电商用户复购预测案例
java·人工智能·spring boot·后端·spring
踢足球092939 分钟前
寒假打卡:2026-2-7
java·开发语言·javascript
闻哥42 分钟前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
金牌归来发现妻女流落街头43 分钟前
【Springboot基础开发】
java·spring boot·后端