二叉树——Java实现

原创 2018年04月16日 19:49:30
package struct;

interface Tree{
	//插入元素
	void insert(int value);
	//中序遍历
	void inOrder();
	//先序遍历
	void perOrder();
	//后序遍历
	void postOrder();
	//层序遍历
	//void levelOrder();
	//求最小值
	int getMinValue();
	//求最小值
	int getMaxValue();
	//指定元素删除
	boolean delete(int value);
	//求元素个数
	int length();
	//求树的高度
	int height();
}

//工厂类
class Factory1{
	//构造函数
	private Factory1(){}
	public static Tree getTreeInstance(){
		return new BinaryTreeImpl();
	}
}

class BinaryTreeImpl implements Tree{
	//根节点
	private Node root;
	private int size;
	class Node{
		//定义左子树
		private Node leftChild;
		//定义右子树
		private Node rightChild;
		private int data;
		//以下为构造方法
		public Node(int data){
			this.data = data;
		}
		public Node(Node leftChild, Node rightChild, int data) {
			super();
			this.leftChild = leftChild;
			this.rightChild = rightChild;
			this.data = data;
		}
	}
	
	//插入元素
	public void insert(int data) {
		Node node = new Node(data);
		//空树
		if(root == null){
			root = node;
			root.leftChild = null;
			root.rightChild = null;
			size++;
		}else{
			//非空树
			Node current = root;
			Node parent = null;
			while(true){
				if(data < current.data){
					parent = current;
					current = parent.leftChild;
					//当前元素小于根节点,当前节点为空
					if(current == null){
						parent.leftChild = node;
						size++;
						break;
					}
				}else if(data > current.data){
					parent = current;
					current = parent.rightChild;
					//当前元素大于根节点,且当前节点为空,否则继续循环使当前的current为根节点
					if(current == null){
						parent.rightChild = node;
						size++;
						break;
					}
				}else{
					System.out.println("have same data in the binary tree;");
				}
			}//end of  while
		}
	}
	//中序遍历
	public void inOrder() {
		System.out.println("中序遍历:");
		inOrder1(root);
		System.out.println();
	}
	//中序遍历递归函数
	private void inOrder1(Node node){
		if( node == null){
			return;
		}
		inOrder1(node.leftChild);
		display(node);
		inOrder1(node.rightChild);
	}
	
	//打印函数
	private void display(Node node){
		System.out.print(node.data+" ");
	}
	
	//前序遍历
	public void perOrder() {
		System.out.println("前序遍历:");
		perOrder1(root);
		System.out.println();
	}
	//前序遍历递归函数
	private void perOrder1(Node node){
		if(node == null){
			return;
		}
		display(node);
		perOrder1(node.leftChild);
		perOrder1(node.rightChild);
	}
	
	//后序遍历
	public void postOrder() {
		System.out.println("后序遍历:");
		postOrder1(root);
		System.out.println();
	}
	//后续遍历递归函数
	private void postOrder1(Node node){
		if(node == null){
			return;
		}
		postOrder1(node.leftChild);
		postOrder1(node.rightChild);
		display(node);
	}
	//层序遍历
	/*
	public void levelOrder() {
	}
	*/
	//求取树中元素最小值
	public int getMinValue() {
		Node node = root;
		//空树无最小元素
		if(root == null){
			return -1;
		}
		Node current = node.leftChild;
		while(true){
			if(current.leftChild == null){
				return current.data;
			}
			current = current.leftChild;
		}
	}
	//求树中最大元素
	public int getMaxValue(){
		Node node = root;
		if(node == null){
			return -1;
		}
		Node current = node.rightChild;
		while(true){
			if(current.rightChild == null){
				return current.data;
			}
			current = current.rightChild;
		}
	}
	//删除树中元素
	public boolean delete(int value) {
		return false;
	}
	//求树中元素个数
	public int length(){
		return size;
	}
	//求树的高度
	public int height(){
		if(root == null){
			return 0;
		}
		return height1(root);
	}
	private int height1(Node node) {
		if(node!=null){
			int lheight = height1(node.leftChild);
			int rheight = height1(node.rightChild);	
			return lheight > rheight ? lheight+1:rheight+1;
		}
		return 0;
	}
}
public class BinaryTree {
	public static void main(String[] args) {
		Tree tree = Factory1.getTreeInstance();
		System.out.println("===============测试insert函数=====================");
		tree.insert(2);
		tree.insert(1);
		tree.insert(5);
		tree.insert(20);
		tree.insert(3);
		tree.insert(7);
		tree.insert(0);
		tree.insert(10);
		System.out.println("\n"+"===============测试length函数====================="+"\n");
		System.out.println(tree.length());
		System.out.println("\n"+"===============测试inOrder函数====================="+"\n");
		tree.inOrder();
		System.out.println("\n"+"===============测试perOrder函数====================="+"\n");
		tree.perOrder();
		System.out.println("\n"+"===============测试postOrder函数====================="+"\n");
		tree.postOrder();
		System.out.println("\n"+"===============测试getMinValue函数====================="+"\n");
		System.out.println(tree.getMinValue());
		System.out.println("\n"+"===============测试getMaxValue函数====================="+"\n");
		System.out.println(tree.getMaxValue());
		System.out.println("\n"+"===============测试height函数====================="+"\n");
		System.out.println(tree.height());
		}
}



时间有点紧张,二叉树的删除较复杂,待我慢慢整理思绪。。。

总把新桃换旧符

总把新桃换旧符——写在《最后期限》出版之前上个星期,《最后期限》的编辑给我一个电话,告诉我这本书在本周内就会生产出来了,让我颇感欣慰。从8月以来,心情一直不好,在上海与CSDN网友见面之后也没有什么特...
  • gigix
  • gigix
  • 2002-12-26 15:28:00
  • 2397

Java实现二叉树

二叉树:二叉树是一棵树,其中每个结点都不能有多余
  • u012736409
  • u012736409
  • 2014-08-05 10:27:59
  • 3431

Java实现简单二叉树

B树       即二叉搜索树:       1.所有非叶子结点至多拥有两个儿子(Left和Right);       2.所有结点存储一个关键字;       3.非叶子结点的左指针指向小于其关键字...
  • liaodehong
  • liaodehong
  • 2016-10-09 18:23:27
  • 2752

二叉树之Java实现二叉树基本操作

参考自《Java数据结构与算法》 定义一个节点类,使节点与二叉树操作分离 class Node { int value; Node leftChild; Node rightChild;...
  • fengrunche
  • fengrunche
  • 2016-08-25 03:08:44
  • 11829

二叉树的二叉链表存储及其Java实现

二叉链表存储的思想是让每个节点都记住它的左、右两个子节点,为每个节点增加left、right两个指针,分别引用该节点的左、右两个子节点,如图所示: 其中,每个节点大致有如下定义:   对于这...
  • bruce_6
  • bruce_6
  • 2014-07-28 16:14:32
  • 2403

java如何实现二叉树

package cn.mdln.program; import java.util.Arrays; import java.util.Arrays; /**  * 树:(有向图)连通的...
  • pangqiandou
  • pangqiandou
  • 2016-08-07 13:21:00
  • 762

java实现二叉树的创建及5种遍历

用java实现的数组创建二叉树以及先序遍历,中序遍历,后序遍历三种遍历
  • ls5718
  • ls5718
  • 2016-04-23 15:52:00
  • 3834

二叉树的顺序存储及其Java实现

顺序存储充分利用满二叉树的特性,即每层的节点数分别为1、2、4、8。。。2i+1,一个深度为i的二叉树最多只能包含2i-1个节点,因此只要定义一个长度为2i-1的数组即可存储这颗二叉树。   对于...
  • bruce_6
  • bruce_6
  • 2014-07-28 09:30:04
  • 2184

序列化二叉树(Java实现)

本题为剑指offer面试题62 牛客网测试地址:https://www.nowcoder.com/questionTerminal/cf7e25aa97c04cc1a68c8f040e71fb84 ...
  • zjkC050818
  • zjkC050818
  • 2017-06-12 14:47:58
  • 396

排序二叉树及其Java实现

定义 排序二叉树的定义也是递归定义的,需要满足: (1)若它的左子树不为空,则左子树上所有节点的值要均小于根节点的值; (2)若它的右子树不为空,则右子树上所有节点的值要均大于根节点的值; (...
  • bruce_6
  • bruce_6
  • 2014-08-18 16:30:45
  • 4328
收藏助手
不良信息举报
您举报文章:二叉树——Java实现
举报原因:
原因补充:

(最多只允许输入30个字)