数据结构之二叉树及其基本操作(java实现)

一、简介

      最近在整理以前写的数据结构的代码资料,顺便做数据结构复习用,故我在这里只做代码展示之用,不做过多的数据结构理论上的讲解。如果读者对代码有异议或者有错误的地方欢迎大家批评指正。感谢大家的阅读。


二、代码展示

        Node.java        用于表示二叉树的节点,存储数据值以及左右孩子的引用值     

package BinaryTree;

//节点类
public class Node {

	int data;
	Node leftChild;
	Node rightChild;
	
	Node(int n){
		this.data=n;
	}
	
	public void Show() {
		System.out.println(this.data+"\t");
	}
}

        BinaryTree.java      用于存储构造展示遍历一颗二叉树,包含了二叉树操作的多种方法

        

package BinaryTree;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;


public class BinaryTree {

	//二叉树的根节点
	Node root;

	BinaryTree(){
		
	}
	
	//指定根节点的值,构造一颗二叉树
	BinaryTree(int n) {
		root = new Node(n);
		root.leftChild = null;
		root.rightChild = null;
	}

	//构造一颗二叉树,其二叉树中的值于data数组中的值相对应
	public void CreateTree(int[] data) {
		
		if(data!=null)
			root=CreateTree(data,1);
	}
	
	public Node CreateTree(int[] data,int index) {
		
		Node tmp;
		
		if(index>data.length)
			return null;
		else {
			tmp=new Node(data[index-1]);
			tmp.leftChild=CreateTree(data,index*2);
			tmp.rightChild=CreateTree(data,index*2+1);
		}
		return tmp;
	}
	
	// 使用重载法,遍历整个二叉树
	// 中序遍历
	public void inOrderTraverse() {
		System.out.println("中序遍历法遍历一颗二叉树");

		inOrderTraverse(root);
	}

	public void inOrderTraverse(Node p) {
		Node tmp = p;

		if (tmp != null) {
			//递归遍历左子树
			inOrderTraverse(tmp.leftChild);
			//访问此节点的内容
			System.out.println(tmp.data);
			//递归遍历右子树
			inOrderTraverse(tmp.rightChild);
		}
	}

	// 前序遍历
	public void preOrderTraverse() {
		System.out.println("先序遍历法遍历一颗二叉树");

		preOrderTraverse(root);
	}

	public void preOrderTraverse(Node p) {
		Node tmp = p;

		if (tmp != null) {
			System.out.println(tmp.data);
			preOrderTraverse(tmp.leftChild);
			preOrderTraverse(tmp.rightChild);
		}
	}
	
	/*
	 * 树的非递归遍历算法[中序遍历](此处只展示代码实现部分,不讲解算法原理部分)
	 * 利用栈
	 */
	public void inOrderTraverse2() {

		System.out.println("中序遍历法遍历一颗二叉树");
		Stack s = new Stack();
		Node p = root;
		
		s.push(p);
		p=p.leftChild;
		
		while(s.isEmpty()==false||p!=null) {
			while(p!=null) {
				s.push(p);
				p=p.leftChild;
			}
			
			p=(Node)s.pop();
			System.out.println(p.data);
			
			p=p.rightChild;
		}
	}
	
	/*
	 * 树的层次遍历(此处只展示代码实现部分,不讲解算法原理部分)
	 * 利用队列
	 */
	public void LevelOrder() {
		
		System.out.println("树的层次遍历");
		
		Queue queue=new LinkedList();
		Node tmp;
		
		queue.offer(root);
		
		while(queue.isEmpty()!=true) {
			tmp=(Node)queue.poll();
			System.out.println(tmp.data);
			
			if(tmp.leftChild!=null)
				queue.offer(tmp.leftChild);
			
			if(tmp.rightChild!=null)
				queue.offer(tmp.rightChild);
		}
	}

	//计算一颗二叉树的深度(分治法)
	public int DepthTree(Node p) {
		
		if(p==null)
			return 0;
		
		int len1=DepthTree(p.leftChild);
		int len2=DepthTree(p.rightChild);
		int len=len1>len2?len1:len2;
			
		return len+1;
	}
}

        BinaryTreeDemo.java        用于测试二叉树的生成算法

        

package BinaryTree;

import java.util.LinkedList;
import java.util.Queue;

public class BinaryTreeDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		BinaryTree root=new BinaryTree();
		int[] data=new int[] {5,8,9,13,10,7,12,18};
	
		root.CreateTree(data);
		root.inOrderTraverse();
		root.LevelOrder();
		
		
		System.out.println("该树的深度为"+root.DepthTree(root.root));
		
	}
}

        

猜你喜欢

转载自blog.csdn.net/qq_36441169/article/details/80918846