【Java数据结构】二叉树

简介:
核心:树中每个节点最多只能有两个子节点(t>=0&&t<=2)

下面实现的是一个二叉排序树(左孩子小于父节点,右孩子大于父节点)

1.插入节点
核心思想:
(1)如果不存在节点,则直接插入。
(2)从根节点开始查找一个相应的节点,即新节点的父节点,当父节点找到后,根据新节点的值来确定新节点是连接到左子节点还是右子节点。

2.查找节点
核心思想:
从根节点开始查找,如果查找到节点值比父节点值要小,则查找其左子树,否则查找其右子树,直到查找到为止,如果不存在节点,则返回null

3.修改节点
核心思想:首先查找节点,找到相应节点后,再进行修改(关键字不要进行修改)。

4.遍历二叉树
遍历二叉树分为三种方法:先序遍历,中序遍历,后序遍历。
先序遍历:访问节点,遍历节点的左子树,遍历节点的右子树。
中序遍历:遍历节点的左子树,访问节点,遍历节点的右子树。
后序遍历:遍历节点的左子树,遍历节点的右子树,访问节点。

树的每个节点模型:
package cn.edu.Tree;

public class Node {
		//关键字
	    private int keyData;
	    
	    //其他数据
	    private int otherData;
	    
	    //左子节点
	    private Node leftNode;
	    
	    //右子节点
	    private Node rightNode;


		public Node(int keyData, int otherData) {
			super();
			this.keyData = keyData;
			this.otherData = otherData;
		}


		public int getKeyData() {
			return keyData;
		}


		public void setKeyData(int keyData) {
			this.keyData = keyData;
		}


		public int getOtherData() {
			return otherData;
		}


		public void setOtherData(int otherData) {
			this.otherData = otherData;
		}


		public Node getLeftNode() {
			return leftNode;
		}


		public void setLeftNode(Node leftNode) {
			this.leftNode = leftNode;
		}


		public Node getRightNode() {
			return rightNode;
		}


		public void setRightNode(Node rightNode) {
			this.rightNode = rightNode;
		}
	    
	    //显示方法
		public void display(){
			System.out.println(this.keyData+" "+this.otherData);
		}
}

二叉树的模型:
package cn.edu.Tree;

public class Tree {
		//根
	    private Node root=null;
	    
	    //插入方法
	    public void insert(int keyData,int otherData){
	    	Node newNode=new Node(keyData,otherData);
	    	
	    	//如果说没有节点
	    	if(root==null){
	    		root=newNode;
	    	}else{
	    	  Node current=root;
	    	  Node parent;
	    	  while(true){
	    	    parent=current;
		    if(keyData<current.getKeyData()){
			    current=current.getLeftNode();
			    if(current==null){
			    	parent.setLeftNode(newNode);
			    	break;
			    }
			   }else{
			    current=current.getRightNode();
			    if(current==null){
			     parent.setRightNode(newNode);
			    	break;
			    }
			   }
	    		}
	    	}
	    }
	    
	    //查找方法
	    public Node find(int keyData){
	    	Node current=root;
	    	while(current.getKeyData()!=keyData){
	    		if(keyData<current.getKeyData()){
	    			current=current.getLeftNode();
	    		}else{
	    			current=current.getRightNode();
	    		}
	    		
	    		if(current==null){
	    			return null;
	    		}
	    	}
	    	return current;
	    }
	    
	    //删除方法
	    public void delete(int keyData){
	    	
	    }
	    
	    //修改方法
	    public void change(int keyData,int otherData){
	    	Node findNode=find(keyData);
	    	findNode.setOtherData(otherData);
	    }
	    
	    //先序遍历
	    public void preOrder(Node node){
	    	if(node!=null){
	    		node.display();
	    		preOrder(node.getLeftNode());
	    		preOrder(node.getRightNode());
	    	}
	    }
	    
	    //中序遍历
	    public void inOrder(Node node){
	    	if(node!=null){
	    		inOrder(node.getLeftNode());
	    		node.display();
	    		inOrder(node.getRightNode());
	    	}
	    }
	    
	    //后序遍历
	    public void endOrder(Node node){
	    	if(node!=null){
	    		endOrder(node.getLeftNode());
	    		endOrder(node.getRightNode());
	    		node.display();
	    	}
	    }
	    
	    public Node getRoot(){
	    	return this.root;
	    }
}

遍历测试:
package cn.edu.Tree;

public class TestTree {
		public static void main(String[] args) {
			Tree tree=new Tree();
			tree.insert(80, 80);
			tree.insert(49, 49);
			tree.insert(42, 42);
			tree.insert(30, 30);
			tree.insert(45, 45);
			tree.insert(90, 90);
			tree.insert(150, 150);
			tree.insert(130, 130);
			tree.insert(82, 82);
			
			
			tree.preOrder(tree.getRoot());
			/* 先序遍历结果
			    80 80
				49 49
				42 42
				30 30
				45 45
				90 90
				82 82
				150 150
				130 130
			 * */
			System.out.println("-----------------------");
			tree.inOrder(tree.getRoot());
			/*中序遍历结果
			    30 30
				42 42
				45 45
				49 49
				80 80
				82 82
				90 90
				130 130
				150 150
			 * */
			System.out.println("-----------------------");
			tree.endOrder(tree.getRoot());
			/*后序遍历结果
			    30 30
				45 45
				42 42
				49 49
				82 82
				130 130
				150 150
				90 90
				80 80


			 * */
			
			/*tree.change(2, 22);
			
			Node findNode=tree.find(2);
			findNode.display();*/
		}
}

转载请注明出处:http://blog.csdn.net/acmman/article/details/50487767
相关文章
|
7月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
246 1
|
5月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
295 3
|
8月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
276 10
 算法系列之数据结构-二叉树
|
7月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
758 1
|
10月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
294 12
|
10月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
191 10
|
10月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
439 3
|
11月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
11月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
179 5
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
308 4

热门文章

最新文章

下一篇
oss云网关配置