import java.util.ArrayList;
public class Tree {
static class Queue { ArrayList data = new ArrayList(); public void putQ(Node a) { data.add(a); } public Node getQ() { if(data.size() > 0) return (Node)data.remove(0); else return null; } } static class Stack { ArrayList data = new ArrayList(); public void push(Node a) { data.add(a); } public Node pop() { if(data.size() > 0) return (Node)data.remove(data.size()-1); else return null; } public Node getTop() { if(data.size() > 0) return (Node)data.get(data.size()-1); else return null; } } static class Node { Node(String value) { this.value = value; } String value; Node left; Node right; Node brother; int layer;//from 1 } Node root; /** * @param args */ public static void main(String[] args) { Tree tree = new Tree(); tree.buildTree(); System.out.println("-----layer---------"); tree.printTree(tree.root,1); tree.connectBrother(); System.out.println("------brother--------"); tree.printBrother(tree.root); System.out.println("-------pre-------"); tree.preOrder(); System.out.println("-------mi-------"); tree.miOrder(); System.out.println("------last--------"); tree.lastOrder(); System.out.println("--------------"); } void buildTree() { Node a = new Node("a"); Node b = new Node("b"); Node c = new Node("c"); Node d = new Node("d"); Node e = new Node("e"); Node f = new Node("f"); Node g = new Node("g"); Node h = new Node("h"); Node i = new Node("i"); this.root = a; a.left = b; a.right = c; b.left = d; b.right = e; d.left = h; c.left = f; c.right = g; f.right = i; } //计算每个节点所处的层次 void printTree(Node node,int layer) { if(node != null) { node.layer = layer; System.out.println(node.value + "****" + node.layer); } if(node.left != null) printTree(node.left,layer+1); if(node.right != null) printTree(node.right,layer+1); } //将所有兄第横向连接起来(需要先计算出每个节点所处的层次) void connectBrother() { Queue q = new Queue(); Node cur = root; Node up = root; Node node = null; q.putQ(cur); while((node=q.getQ()) != null) { if(node.layer == up.layer) { up.brother = node; } if(node.left!=null) { q.putQ(node.left); } if(node.right!=null) { q.putQ(node.right); } up = node; } } void printBrother(Node node) { if(node != null) { if(node.brother != null) System.out.println(node.value + "--" + node.brother.value); else System.out.println(node.value + "--" + node.brother); } if(node.left != null) printBrother(node.left); if(node.right != null) printBrother(node.right); } //先序 void preOrder() { Stack s = new Stack(); Node cur = root; s.push(cur); while((cur=s.pop())!=null) { System.out.println(cur.value); if(cur.right!=null) s.push(cur.right); if(cur.left!=null) s.push(cur.left); } } //中序 void miOrder() { Stack s = new Stack(); Node p = root; while((p != null)||(s.data.size() > 0)) { while(p != null) { s.push(p); p = p.left; } p = s.pop(); System.out.println(p.value); p = p.right; } } //后序 void lastOrder() { Stack s = new Stack(); Node p = root; Node pre = null; while((p != null)||(s.data.size() > 0)) { while(p != null) { s.push(p); p = p.left; } p = s.getTop(); if(p.right == null || p.right == pre) { System.out.println(p.value); s.pop(); pre = p; p = null; } else { p = p.right; } } }}