实现二叉树(包括前序、中序、后序遍历算法)

以前没有记笔记的习惯,结果发现曾经实现过的东西居然都忘了,现在又需要花时间去看,去写,虽然又有所收获,但是毕竟在走重复的路。

从今天起,开始打路标,为了以后少走回头路:)

还请高手多指点,不胜感激!


用Java语言实现二叉树:

1、首先定义一个二叉树节点类:实现

1)向某个节点下面添加节点方法;

2)从某个节点前序遍历所有树节点;

3)从某个节点中序遍历所有树节点;

4)从某个节点后序遍历所有树节点;

/**
 * 二叉树节点
 * 
 * @author dobuy
 * 
 */
public class TreeNode
{
	/**
	 * 左树节点
	 */
	private TreeNode leftTreeNode;

	/**
	 * 右树节点
	 */
	private TreeNode rightTreeNode;

	/**
	 * 当前树节点的数值
	 */
	private int data;

	public TreeNode(int data)
	{
		setData(data);
	}

	/**
	 * 添加树节点
	 * 
	 * @param treeNode
	 */
	public void addTreeNode(TreeNode treeNode)
	{
		// 插入节点比当前节点小,添加到左节点上
		if (getData() > treeNode.getData())
		{
			// 当前节点存在左节点,添加至左树节点上
			if (null != getLeftTreeNode())
			{
				getLeftTreeNode().addTreeNode(treeNode);
			}
			// 不存在左树节点,插入节点直接设成当前的左树节点
			else
			{
				setLeftTreeNode(treeNode);
			}
		}
		// 否则添加到右树节点上
		else
		{
			// 当前节点存在右树节点,添加至右树节点上
			if (null != getRightTreeNode())
			{
				getRightTreeNode().addTreeNode(treeNode);
			}
			// 不存在右树节点,插入节点直接设成当前的右树节点
			else
			{
				setRightTreeNode(treeNode);
			}
		}

	}

	/**
	 * 前序遍历树节点
	 * 
	 */
	public void preOrder()
	{
		// 打印当前树节点数据
		System.out.print(getData() + "\t");

		// 存在左树节点,前序遍历左树节点
		if (null != getLeftTreeNode())
		{
			getLeftTreeNode().preOrder();
		}

		// 存在右树节点,前序遍历右树节点
		if (null != getRightTreeNode())
		{
			getRightTreeNode().preOrder();
		}
	}

	/**
	 * 中序遍历树节点
	 * 
	 */
	public void midOrder()
	{
		// 存在左树节点,中序序遍历左树节点
		if (null != getLeftTreeNode())
		{
			getLeftTreeNode().midOrder();
		}

		// 打印当前树节点数据
		System.out.print(getData() + "\t");

		// 存在右树节点,中序遍历右树节点
		if (null != getRightTreeNode())
		{
			getRightTreeNode().midOrder();
		}
	}

	/**
	 * 后序遍历树节点
	 */
	public void backOrder()
	{
		// 存在左树节点,后序遍历左树节点
		if (null != getLeftTreeNode())
		{
			getLeftTreeNode().backOrder();
		}

		// 存在右树节点,后序遍历右树节点
		if (null != getRightTreeNode())
		{
			getRightTreeNode().backOrder();
		}

		// 打印当前树节点数据
		System.out.print(getData() + "\t");
	}

	public TreeNode getLeftTreeNode()
	{
		return leftTreeNode;
	}

	public void setLeftTreeNode(TreeNode leftTreeNode)
	{
		this.leftTreeNode = leftTreeNode;
	}

	public TreeNode getRightTreeNode()
	{
		return rightTreeNode;
	}

	public void setRightTreeNode(TreeNode rightTreeNode)
	{
		this.rightTreeNode = rightTreeNode;
	}

	public int getData()
	{
		return data;
	}

	public void setData(int data)
	{
		this.data = data;
	}

}



2、再定义一个二叉树类,主要负责包装树节点,构造出二叉树。如:对外提供添加数据方法,把数据转换成树节点,并添加到二叉树中;

还提供了前序、中序、后序的对外接口方法;

/**
 * 二叉树
 * 
 * @author dobuy
 */
public class BinaryTree
{
	/**
	 * 定义根节点
	 */
	private TreeNode root;

	/**
	 * 添加一个节点
	 * 
	 * @param data
	 */
	public void addNode(int data)
	{
		// 创建一个树节点
		TreeNode treeNode = new TreeNode(data);

		// 如果不是第一次创建,插入到根节点下面
		if (null != root)
		{
			root.addTreeNode(treeNode);
		}
		// 没有根节点时,把该节点设成根节点
		else
		{
			root = treeNode;
		}
	}

	/**
	 * 前序遍历树节点
	 */
	public void preOrder()
	{
		if (null != root)
		{
			System.out.print("preOrder:");
			root.preOrder();
			System.out.println();
		}
		else
		{
			System.out.println("there is no node in binary tree.");
		}
	}

	/**
	 * 中序遍历树节点
	 */
	public void midOrder()
	{
		if (null != root)
		{
			System.out.print("midOrder:");
			root.midOrder();
			System.out.println();
		}
		else
		{
			System.out.println("there is no node in binary tree.");
		}
	}

	/**
	 * 后序遍历树节点
	 */
	public void backOrder()
	{
		if (null != root)
		{
			System.out.print("backOrder:");
			root.backOrder();
			System.out.println();
		}
		else
		{
			System.out.println("there is no node in binary tree.");
		}
	}
}

3、提供Junit测试类,进行简单的功能测试:

import org.junit.Test;

public class BinaryTreeTest
{
	@Test
	public void test()
	{
		// 创建二叉树对象
		BinaryTree tree = new BinaryTree();

		// 添加树节点
		tree.addNode(10);
		tree.addNode(13);
		tree.addNode(5);
		tree.addNode(7);
		tree.addNode(3);
		tree.addNode(8);
		tree.addNode(4);
		tree.addNode(20);
		tree.addNode(15);
		tree.addNode(12);
		tree.addNode(11);

		// 前序遍历二叉树
		tree.preOrder();

		// 中序遍历二叉树
		tree.midOrder();

		// 后序遍历二叉树
		tree.backOrder();
	}

}

Junit运行BinaryTreeTest.java,测试结果如下

preOrder:10	5	3	4	7	8	13	12	11	20	15	
midOrder:3	4	5	7	8	10	11	12	13	15	20	
backOrder:4	3	8	7	5	11	12	15	20	13	10	




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值