Tree Traversal (preOrder, inOrder, postOrder, levelOrder, zigzagOrder)
1 class TreeNode{ 2 char data; 3 TreeNode left; 4 TreeNode right; 5 static int leaf; 6 static boolean flag=true; 7 TreeNode (char c){ 8 data = c; 9 } 10 TreeNode (TreeNode n){ 11 data = n.data; 12 left = n.left; 13 right = n.right; 14 } 15 16 public static void visit(TreeNode n){ 17 if(n == null) 18 System.out.print(""); 19 else{ 20 if(flag){ 21 System.out.print(n.data); 22 flag = false; 23 }else{ 24 System.out.print(" " + n.data); 25 } 26 } 27 if(n.left == null && n.right == null) { 28 leaf++; 29 } 30 } 31 32 public static void preOrder(TreeNode root){ 33 if(root == null) return; 34 visit(root); 35 preOrder(root.left); 36 preOrder(root.right); 37 } 38 39 // public static void preOrder2(TreeNode root){ 40 // if(root == null) return; 41 // Stack<TreeNode> stack = new Stack<TreeNode>(); 42 // stack.add(root); 43 // while(!stack.isEmpty()){ 44 // TreeNode top = stack.pop(); 45 // visit(top); 46 // if(top.right != null) stack.add(top.right); 47 // if(top.left != null) stack.add(top.left); 48 // } 49 // } 50 51 public static void preOrder2(TreeNode root){ 52 if(root == null) return; 53 Stack<TreeNode> stack = new Stack<TreeNode>(); 54 while(!stack.isEmpty() || root != null){ 55 if(root != null){ 56 stack.push(root); 57 visit(root); 58 root = root.left; 59 }else{ 60 root = stack.pop(); 61 root = root.right; 62 } 63 } 64 } 65 public static void inOrder(TreeNode root){ 66 if(root == null) return; 67 inOrder(root.left); 68 visit(root); 69 inOrder(root.right); 70 } 71 72 public static void inOrder2(TreeNode root){ 73 if(root == null) return; 74 Stack<TreeNode> stack = new Stack<TreeNode>(); 75 while(!stack.empty() || root != null){ 76 if(root != null){ 77 stack.push(root); 78 root = root.left; 79 }else{ 80 //reached leftMost 81 root = stack.pop(); 82 visit(root); 83 root = root.right; 84 } 85 } 86 } 87 88 public static void postOrder(TreeNode root){ 89 if(root == null) return; 90 postOrder(root.left); 91 postOrder(root.right); 92 visit(root); 93 } 94 95 public static void levelOrder(TreeNode root){ 96 if(root == null) return; 97 LinkedList<TreeNode> q = new LinkedList<TreeNode>(); 98 q.add(root); 99 while(!q.isEmpty()){ 100 TreeNode head = q.removeFirst(); 101 visit(head); 102 if(head.left != null) q.add(head.left); 103 if(head.right != null) q.add(head.right); 104 } 105 } 106 107 public static void zigzagOrder(TreeNode root){ 108 LinkedList<TreeNode> currentLevel = new LinkedList<TreeNode>(); 109 int level = 0; 110 if(root != null) 111 currentLevel.add(root); 112 while(!currentLevel.isEmpty()){ 113 LinkedList<TreeNode> nextLevel = new LinkedList<TreeNode>(); 114 ArrayList<TreeNode> list = new ArrayList<TreeNode>(); 115 for(TreeNode node : currentLevel){ 116 list.add(node); 117 if(node.left != null) 118 nextLevel.add(node.left); 119 if(node.right != null) 120 nextLevel.add(node.right); 121 } 122 if(level%2 == 1) 123 Collections.reverse(list); 124 for(int i = 0; i < list.size(); i++) 125 visit(list.get(i)); 126 currentLevel = nextLevel; 127 level++; 128 } 129 130 } 131 132 }