java创建二叉树并实现非递归中序遍历二叉树
java创建二叉树并递归遍历二叉树前面已有讲解:http://www.cnblogs.com/lixiaolun/p/4658659.html。
在此基础上添加了非递归中序遍历二叉树:
二叉树类的代码:
package binarytree; import linkedstack.LinkStack;
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 inOrderTraverse2(Node node)
{
if(node == null)
{
return;
}
LinkStack lStack = new LinkStack();
lStack.initStack();//初始化栈
Node p =node;
while(p!=null || !lStack.isEmpty())
{
if(p!=null)//遍历左子树,向左走到尽头,并将走过的节点入栈
{
lStack.push(p);
p=p.lchild;
}else//访问节点,向右走一步
{
p=(Node) lStack.pop();
visit(p);
p=p.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非递归中序遍历:");
inOrderTraverse2(root);
System.out.print("\n后序遍历:");
postOrderTraverse(root); } /**
* 访问节点
* */
private void visit(Node node)
{
if(!node.data.equals("0"))
{
System.out.print(node.data);
}
}
}
测试类代码:
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创建二叉树并实现非递归中序遍历二叉树的更多相关文章
- LeetCode 94 | 基础题,如何不用递归中序遍历二叉树?
		今天是LeetCode专题第60篇文章,我们一起来看的是LeetCode的94题,二叉树的中序遍历. 这道题的官方难度是Medium,点赞3304,反对只有140,通过率有63.2%,在Medium的 ... 
- java建立二叉树,递归/非递归先序遍历,递归/非递归中序遍历,层次遍历
		import java.util.LinkedList; import java.util.Scanner; import java.util.Stack; //structure of binary ... 
- LeetCode:二叉树的非递归中序遍历
		第一次动手写二叉树的,有点小激动,64行的if花了点时间,上传leetcode一次点亮~~~ /* inorder traversal binary tree */ #include <stdi ... 
- Python实现二叉树的非递归中序遍历
		思路: 1. 使用一个栈保存结点(列表实现): 2. 如果结点存在,入栈,然后将当前指针指向左子树,直到为空: 3. 当前结点不存在,则出栈栈顶元素,并把当前指针指向栈顶元素的右子树: 4. 栈不为空 ... 
- Leetcode 94. Binary Tree Inorder Traversal (中序遍历二叉树)
		Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ... 
- 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】
		[145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ... 
- LeetCode OJ:Binary Tree Inorder Traversal(中序遍历二叉树)
		Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ... 
- YTU 2346: 中序遍历二叉树
		原文链接:https://www.dreamwings.cn/ytu2346/2606.html 2346: 中序遍历二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 12 解决: ... 
- 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)
		递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ... 
随机推荐
- hibernate之条件查询
			一.条件查询简介 条件查询是更据面向对象特色的数据查询方式,主要通过如下3个类完成 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询 ... 
- bzoj 1012 BST 支持插入,区间最大
			水... /************************************************************** Problem: 1012 User: idy002 Lang ... 
- bzoj 3298: [USACO 2011Open]cow checkers  -- 数学
			3298: [USACO 2011Open]cow checkers Time Limit: 10 Sec Memory Limit: 128 MB Description 一天,Besssie准备 ... 
- HDU 5575 Discover Water Tank 并查集 树形DP
			题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ... 
- python开发_类型转换convert
			在python的开发过程中,难免会遇到类型转换,这里给出常见的类型转换demo: int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float ... 
- [转]Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
			收藏ArrayAdapter.SimpleAdapter和BaseAdapter的一些简短代码片段,希望用时方便想起其用法. 1.ArrayAdapter 只可以简单的显示一行文本 代码片段: A ... 
- Codeforces Beta Round #4 (Div. 2 Only) A. Watermelon 水题
			A. Watermelon 题目连接: http://www.codeforces.com/contest/4/problem/A Description One hot summer day Pet ... 
- HDU 5642 King's Order 动态规划
			King's Order 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5642 Description After the king's speec ... 
- MySQL之thread cache
			最近突然对MySQL的连接非常感兴趣,从status根据thread关键字可以查出如下是个状态 show global status like 'thread%'; +---------------- ... 
- FPGA LVDS I/O as an Analog Programmable Comparator
			http://www.eetimes.com/author.asp?section_id=36&doc_id=1320289 Seeing the new ADC IP being bandi ... 
