二叉树三种遍历的非递归实现
2015-10-07 19:28
309 查看
下面利用一个栈(Stack)分别实现了二叉树的非递归式的前序、中序、后续遍历。代码最后,自定义一个People类,并存储在二叉树中,并依此利用三种遍历方法输出每个People。
import java.util.Stack; class TreeNode<K> { TreeNode<K> left, right; K key; public TreeNode(K k) { left = null; right = null; key = k; } } class BinaryTree<K extends Comparable<K> > { //添加 extends Comparable<K>后,K对象可以进行比较。 TreeNode<K> root; public BinaryTree() { root = null; } public void createTree(TreeNode<K> node, K data) { //建立二叉树 if(root == null) { root = new TreeNode<K>(data); } else { if(data.compareTo(node.key) < 0) { if(node.left == null) node.left = new TreeNode<K>(data); else createTree(node.left, data); } else { if(node.right == null) node.right = new TreeNode<K>(data); else createTree(node.right, data); } } } public void preOrder(TreeNode<K> root) { // 前序遍历,非递归实现。 if(root != null) { Stack<TreeNode<K>> stack = new Stack<TreeNode<K>>(); stack.push(root); while (!stack.isEmpty()) { TreeNode<K> tmp = stack.pop(); System.out.println(tmp.key); if(tmp.right != null) stack.push(tmp.right); if(tmp.left != null) stack.push(tmp.left); } } } public void inOrder(TreeNode<K> root) { //中序遍历,非递归实现 Stack<TreeNode<K>> stack = new Stack<TreeNode<K>>(); while (root != null || !stack.isEmpty()) { while(root != null) { stack.push(root); root = root.left; } if (!stack.isEmpty()) { TreeNode<K> tmp = stack.pop(); System.out.println(tmp.key); root = tmp.right; } } } public void postOrder(TreeNode<K> root) { //后序遍历,非递归实现 Stack<TreeNode<K>> stack = new Stack<TreeNode<K>>(); TreeNode<K> pre = root; //记录上一个输出的节点。 while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root); root = root.left; } if (!stack.isEmpty()) { TreeNode<K> tmp = stack.peek().right; if(tmp == null || tmp == pre) { TreeNode<K> tmp2 = stack.pop(); System.out.println(tmp2.key); pre = tmp2; root = null; } else { root = tmp; } } } } } class People implements Comparable<People> { // 自定义People类,并覆盖了equals,hashCode,toString方法,实现了Comparable接口。 String name; int age; public People(String n, int a) { name = n; age = a; } @Override public boolean equals(Object obj) { if(this == obj) return true; if(!(obj instanceof People)) return false; return this.name.equals(((People)obj).name) && this.age == ((People)obj).age; } @Override public int hashCode() { return name.hashCode()*37 + age; } @Override public String toString() { return name + "," + age; } @Override public int compareTo(People o) { return this.age - o.age; } } public class TestClass { public static void main(String[] args) {//6, 8, 7, 5, 2, 5 People[] people = new People[] { new People("xue", 6), new People("hong", 8), new People("jun", 7), new People("shang", 5), new People("hai", 2), new People("bei", 5)}; BinaryTree<People> bt = new BinaryTree<People>(); for (int i = 0; i < people.length; i++) { bt.createTree(bt.root, people[i]); } // bt.preOrder(bt.root); // bt.inOrder(bt.root); bt.postOrder(bt.root); } }
相关文章推荐
- Swift学习笔试19——扩展(Extension)
- 简单的百度预测搜索功能(php+jQuery+js+ajax)
- 从道德经中学习java
- POJ 2513 【字典树】【欧拉回路】
- 用imageMagick进行图片打水印
- 复习
- 四则运算
- 数组最大矩形面积
- Sicily 1151. 魔板
- Mysql导出表数据到文本文件
- HDU5119(DP)
- Web APi之认证(Authentication)两种实现方式【二】(十三)
- SQL Server ->> CLR编程问题汇总
- hdu4751Divide Groups 二分图判断
- IOS谓词--NSPredicate
- 毕业一年(这个总结来的比较晚)
- 1006实验一实验报告
- 九九乘法
- Java中的静态分派与动态分派
- Two Sum