【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

时间: 2024-10-31 00:31:12

【Java数据结构】二叉树的相关文章

java 数据结构二叉树的实现代码_java

1. 二叉树接口 public interface BinaryTreeInterface<T> { public T getRootData(); public int getHeight(); public int getNumberOfRoot(); public void clear(); public void setTree(T rootData); // 用rootData设置树 public void setTree(T rootData,BinaryTreeInterface

java语言 二叉树(三叉链表存储结构)的深拷贝

问题描述 java语言 二叉树(三叉链表存储结构)的深拷贝 爆炸,这个非递归好复杂,规定不使用栈的非递归,递归都会,非递归就蒙了,有大神能挑战一下吗,急 解决方案 二叉树是一种特殊的数据结构,我们可以对它线性化,方法是,0表示根节点,1 2表示它的子节点,3 4 5 6表示1 2的子节点7 8 9 10 11 12 13 14是再下层-- 很明显,知道一个节点,它的子节点的索引值就是x2+1和x2+2,它的父节点就是-1再整除2. 有了这个知识点,就可以用数组来表示二叉树,也就不用递归和堆栈了.

算法-求助,数据结构二叉树问题

问题描述 求助,数据结构二叉树问题 试编写算法,求给定二叉树上从根结点到叶子结点的一条其路径长度等于树的深度减一的路径(即列出从根结点到该叶子结点的结点序列),若这样的路径存在多条,则输出路径终点(叶子结点)在"最左"的一条. 解决方案 ?? #define null 0???#include "stdio.h"???typedef char datatype;?? typedef struct tn? {datatype data;?? struct tn lc,

数据结构二叉树问题求助

问题描述 数据结构二叉树问题求助 设只含根结点的二叉树的高度为0,则高度为k的二叉树的最大结点数为(),最小结点数为() 答案是(2^k+1)-1和k+1.我做出来的是(2^k)-1和k 求帮忙算一下哪个是对的,谢谢了 解决方案 带入法计算就可以了.跟节点高度为0,比如高度为1,最大就有3个,最小两个.一看你的答案就错了. 解决方案二: ?? #define null 0???#include "stdio.h" ???typedef char datatype;?? typedef

JAVA数据结构系列 栈

java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为它要维护自己的指针(Next)引用. package com.rsc.stack; import java.util.LinkedList; /** * 利用链表实现的栈 * @author 落雨 * http://ae6623.cn * @param <T> */ public class Li

java数据结构和算法 22只鞋子,拿多少次可以拿一双

问题描述 java数据结构和算法 22只鞋子,拿多少次可以拿一双 22只鞋子 5双运动鞋,4双凉鞋,2双礼服鞋放在看不到的盒子里, 一次拿一只 最少拿多少次可以拿一双鞋子(左右脚也要对应) 解决方案 假设已经拿了5只左脚的运动鞋,4只凉鞋,2只礼服鞋,那么再拿一只,一定可以组成一双鞋,所以是12次 解决方案二: 应该是12次,不信的话你在问其他人. 解决方案三: 最少几次?2最多几次?12.....

Java 数据结构链表操作实现代码_java

 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表.循环链表.双向链表,下面将逐一介绍.链表在数据结构中是基础,也是重要的知识点,这里讲下Java 中链表的实现, JAVA 链表操作:单链表和双链表 主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都相应的应用,链表有多种类别,文章针对单链表和双链表进行分析.链表中数据就像被一个

java数据结构与算法之插入算法实现数值排序示例_java

本文实例讲述了java数据结构与算法之插入算法实现数值排序.分享给大家供大家参考,具体如下: 写在这里做个纪念,关键是要理解插入点,在插入点,初始的in和out都在这个插入点,然后通过in自减对数组进行重新排序 public static void insertSort(){ for(int out=1; out<a.length; out++){ int temp = a[out]; int in = out; while(in>0&& a[in-1]>temp){ a

java数据结构与算法之noDups去除重复项算法示例_java

本文实例讲述了java数据结构与算法之noDups去除重复项算法.分享给大家供大家参考,具体如下: public static void noDupa(int[] a){ int count = 0;//in int sub = 0;//计数器 for(int i=0; i<a.length-1; i++){//外层循环 if(a[i] != a[i+1]){ a[count] = a[i]; count++; } } } PS:感觉这个算法粗略看下觉得没啥子,实际上相当精妙!!先决条件---数

java数据结构与算法之中缀表达式转为后缀表达式的方法_java

本文实例讲述了java数据结构与算法之中缀表达式转为后缀表达式的方法.分享给大家供大家参考,具体如下: //stack public class StackX { private int top; private char[] stackArray; private int maxSize; //constructor public StackX(int maxSize){ this.maxSize = maxSize; this.top = -1; stackArray = new char[