java创建二叉树并递归遍历二叉树
二叉树类代码:
package binarytree;
import linkqueue.LinkQueue;
public class BinaryTree {
	class Node
	{
		public Object data;
		public Node lchild;
		public Node rchild;
		public Node(Object data)
		{
			this.data = data;
			this.lchild = null;
			this.rchild = null;
		}
	}
	//根节点
	private Node root = null;
	private Node node = null;
	/**
	 * 创建树
	 *
	 * 以完全二叉树的格式来创建(子树不存在的用0填充),
	 * 对完全二叉树中每一个节点从0开始进行编号,
	 * 那么第i个节点的左孩子的编号为2*i+1,右孩子为2*i+2。
	 *
	 * */
	void createTree(String strtree)
	{
		LinkQueue lQueue = new LinkQueue();
		lQueue.initQueue();
		/**
		 * 完全二叉树中第i层的结点的个数最多为第1到i-1层上所有节点的个数和
		 * 所以父节点的个数最多为N-1个,N表示节点个数
		 * */
		for(int parentIndex =0; parentIndex<strtree.split(" ").length/2;parentIndex++)
		{
			if(root == null)
			{
				root= new Node(strtree.split(" ")[parentIndex]);
				//左孩子
				root.lchild = new Node(strtree.split(" ")[parentIndex*2+1]);
				lQueue.enQueue(root.lchild);
				//右孩子
				root.rchild = new Node(strtree.split(" ")[parentIndex*2+2]);
				lQueue.enQueue(root.rchild);
			}else
			{
				if(!lQueue.isEmpty() && parentIndex*2+1<strtree.split(" ").length)//队列不空
				{
					node = (Node) lQueue.deQueue();
					if(parentIndex*2+1<strtree.split(" ").length)
					{
						//左孩子
						node.lchild = new Node(strtree.split(" ")[parentIndex*2+1]);
						lQueue.enQueue(node.lchild);
					}
					if(parentIndex*2+2<strtree.split(" ").length)
					{
						//右孩子
						node.rchild = new Node(strtree.split(" ")[parentIndex*2+2]);
						lQueue.enQueue(node.rchild);
					}
				}else
				{
					return;
				}
			}
		}
	}
	/**
	 * 先序遍历二叉树
	 * */
	void preOrderTraverse(Node node)
	{
		if(node == null)
		{
			return;
		}
		visit(node);
		preOrderTraverse(node.lchild);
		preOrderTraverse(node.rchild);
	}
	/**
	 * 中序遍历二叉树
	 * */
	void inOrderTraverse(Node node)
	{
		if(node == null)
		{
			return;
		}
		inOrderTraverse(node.lchild);
		visit(node);
		inOrderTraverse(node.rchild);
	}
	/**
	 * 后序遍历二叉树
	 * */
	void postOrderTraverse(Node node)
	{
		if(node == null)
		{
			return;
		}
		postOrderTraverse(node.lchild);
		postOrderTraverse(node.rchild);
		visit(node);
	}
	/**
	 * 打印二叉树
	 * */
	public void print()
	{
		System.out.print("先序遍历:");
		preOrderTraverse(root);
		System.out.print("\n中序遍历:");
		inOrderTraverse(root);
		System.out.print("\n后序遍历:");
		postOrderTraverse(root);
	}
	/**
	 * 访问节点
	 * */
	private void visit(Node node)
	{
		if(!node.data.equals("0"))
		{
			System.out.print(node.data+" ");
		}
	}
}
测试代码(以数据结构中表达式a+b*(c-d)-e/f为例):
package binarytree;
public class BinaryTreeMain {
	public static void main(String[] args) {
		BinaryTree binaryTree = new BinaryTree();
		String strtree="- + / a * e f 0 0 b - 0 0 0 0 0 0 0 0 0 0 c d";//0表示没有值的位置
		binaryTree.createTree(strtree);
		binaryTree.print();
	}
}
运行结果:

java创建二叉树并递归遍历二叉树的更多相关文章
- JAVA递归、非递归遍历二叉树(转)
		原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ... 
- 非递归遍历二叉树Java版的实现代码(没写层次遍历)
		直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ... 
- 非递归遍历二叉树Java实现
		2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ... 
- SDUT 3341 数据结构实验之二叉树二:遍历二叉树
		数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉 ... 
- SDUT OJ 数据结构实验之二叉树二:遍历二叉树
		数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ... 
- SDUT-3441_数据结构实验之二叉树二:遍历二叉树
		数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知二叉树的一个按先序遍历输入的字符 ... 
- JAVA递归、非递归遍历二叉树
		前序遍历:1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历:1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历:1.后序遍历左子树 2.后序遍历右子树 3.访问根节点-- ... 
- 数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)
		Nonrecursive Traversal of Binary Tree First I wanna talk about why we should <code>Stack</c ... 
- C++编程练习(17)----“二叉树非递归遍历的实现“
		二叉树的非递归遍历 最近看书上说道要掌握二叉树遍历的6种编写方式,之前只用递归方式编写过,这次就用非递归方式编写试一试. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历 ... 
随机推荐
- Linux内核镜像格式
			<Linux内核镜像格式> Linux内核有多种格式的镜像,包括vmlinux.Image.zImage.bzImage.uImage.xipImage.bootpImage等. ➤k ... 
- FastReport.Net使用:[19]复选框的使用
			FastReport中,用好复选框会使报表更美观. 复选框的用法举例: 1.点菜系统中,打印用户点菜时,将已点的菜进行打“√”标记等. 2.选课系统中,将已选科目进行打“√”等. 认识复选框 复选框只 ... 
- 【BZOJ 4035】 4035: [HAOI2015]数组游戏 (博弈)
			4035: [HAOI2015]数组游戏 Time Limit: 15 Sec Memory Limit: 32 MBSubmit: 181 Solved: 89 Description 有一个长 ... 
- codevs 1214 线段覆盖
			1214 线段覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段 ... 
- 【贪心】hdu4803 Poor Warehouse Keeper
			题意:一开始有1个物品,总价是1.你的一次操作可以要么使得物品数量+1,总价加上当前物品的单价.要么可以使得总价+1,物品数量不变.问你最少要几次操作从初始状态到达有x个物品,总价是y的状态.这里的y ... 
- 密码加密_md5
			md5加密 package com.fh.util; import java.security.MessageDigest; public class MD5 { public static Stri ... 
- C# dataGridView根据数据调整列宽
			//自适应列宽 this.dgvBaoming.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.A ... 
- <摘录>Gson对Java嵌套对象和JSON字符串之间的转换
			JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ... 
- IOS-百度地图API用点生成线路、导航、自定义标注 2013年11月更新
			IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽IOS百度地图开发POISearch搜索附近停车场,附近加油站IOS百度地图视角跳到用户当前位置IOS百度地图开发实时路况IOS开发百 ... 
- jsoup-1.7.2.jar 包
			org.jsoup.Jsoup; org.jsoup.nodes.Document; org.jsoup.nodes.Element; org.jsoup.select.Elements; 
