首页 > 代码库 > [转] 树的递归与非递归遍历
[转] 树的递归与非递归遍历
1 public class Tree<T> { 2 private T data; 3 private Tree<T> left; 4 private Tree<T> right; 5 6 private Tree(T data) { 7 this.data =http://www.mamicode.com/ data; 8 9 } 10 11 public Tree(T[] datas) { 12 makeTree(datas, this); 13 } 14 15 public interface Visitor<T> { 16 void process(T data); 17 } 18 19 /** 20 * 递归中序遍历 21 * 22 * @param visitor 23 */ 24 public void recursionInOrder(Visitor<T> visitor) { 25 if (left != null)// 如果左子树存在,先访问左子树 26 left.recursionInOrder(visitor); 27 visitor.process(data);// 访问当前结点 28 if (right != null)// 如果右子树存在,访问右子树 29 right.recursionInOrder(visitor); 30 } 31 32 /** 33 * 递归先序遍历 34 * 35 * @param visitor 36 */ 37 public void recursionPreOrder(Visitor<T> visitor) { 38 visitor.process(data);// 访问当前结点 39 if (left != null)// 如果左子树存在,访问左子树 40 left.recursionPreOrder(visitor); 41 if (right != null)// 如果右子树存在,访问右子树 42 right.recursionPreOrder(visitor); 43 } 44 45 /** 46 * 递归后序遍历 47 * 48 * @param visitor 49 */ 50 public void recursionPostOrder(Visitor<T> visitor) { 51 if (left != null)// 如果左子树存在,先访问左子树 52 left.recursionInOrder(visitor); 53 if (right != null)// 如果右子树存在,访问右子树 54 right.recursionInOrder(visitor); 55 visitor.process(data);// 访问当前结点 56 } 57 58 /** 59 * 层次遍历 60 * 61 * @param visitor 62 */ 63 public void levelViste(Visitor<T> visitor) { 64 Queue<Tree<T>> queue = new LinkedList<Tree<T>>(); 65 queue.add(this); 66 while (!queue.isEmpty()) { 67 Tree<T> node = queue.poll(); 68 visitor.process(node.data); 69 if (node.left != null) 70 queue.add(node.left); 71 if (node.right != null) 72 queue.add(node.right); 73 } 74 } 75 76 /** 77 * 先序遍历 78 * 79 * @param visitor 80 */ 81 public void preOrderViste(Visitor<T> visitor) { 82 Stack<Tree<T>> stack = new Stack<Tree<T>>(); 83 Tree<T> node = this; 84 while (node != null || !stack.isEmpty()) { 85 if (node != null) {// 向左走到尽头 86 visitor.process(node.data); 87 stack.add(node); 88 node = node.left; 89 } else { 90 node = stack.pop(); 91 node = node.right; 92 } 93 } 94 } 95 96 /** 97 * 中序遍历 98 * 99 * @param visitor100 */101 public void inOrderViste(Visitor<T> visitor) {102 103 Stack<Tree<T>> stack = new Stack<Tree<T>>();104 Tree<T> node = this;105 while (node != null || !stack.isEmpty()) {106 if (node != null) {// 向左走到尽头107 stack.add(node);108 node = node.left;109 } else {110 node = stack.pop();111 visitor.process(node.data);112 node = node.right;113 }114 }115 }116 117 /**118 * 后续遍历119 * 120 * @param visitor121 */122 public void postOrderViste(Visitor<T> visitor) {123 Stack<Tree<T>> stack = new Stack<Tree<T>>();124 Tree<T> node = this, last = null;125 while (node != null || !stack.isEmpty()) {126 if (node != null) {// 向左走到尽头127 stack.add(node);128 node = node.left;129 } else {130 node = stack.peek();131 if (node.right != null && node.right != last) {// 有右孩子132 node = node.right;// 向右走一步133 stack.add(node);134 node = node.left;// 向左走到尽头135 } else {// 访问结点136 node = stack.pop();137 visitor.process(node.data);138 last = node;139 node = null;// 置为空,强制去探索右孩子140 }141 }142 }143 }144 145 /**146 * 构造一个满二叉树147 * 148 * @param datas149 * @param root150 */151 public void makeTree(T[] datas, Tree<T> root) {152 List<Tree<T>> trees = new ArrayList<Tree<T>>(datas.length);153 root.data = http://www.mamicode.com/datas[0];154 trees.add(root);155 for (int i = 1; i < datas.length; i++) {156 trees.add(new Tree<T>(datas[i]));157 }158 int level = (int) (Math.log(datas.length) / Math.log(2));159 for (int i = 0; i <= level; i++) {160 int left = i * 2 + 1;161 if (left < datas.length)162 trees.get(i).left = trees.get(left);163 int right = i * 2 + 2;164 if (right < datas.length)165 trees.get(i).right = trees.get(right);166 }167 }168 169 private static Visitor<Integer> visitor = new Visitor<Integer>() {170 @Override171 public void process(Integer data) {172 System.out.print(data + " ");173 }174 };175 176 /**177 * 根据方法名测试访问178 * 179 * @param tree180 * @param method181 * @param visitor182 * @throws Exception183 */184 private static void test(Tree<?> tree, String method, Visitor<?> visitor)185 throws Exception {186 Class<?> c = (Class<?>) Class.forName("tree.Tree");187 Method func = c.getDeclaredMethod(method, Visitor.class);188 func.invoke(tree, visitor);189 System.out.println("(" + method + ")");190 191 }192 193 public static void main(String[] args) throws Exception {194 Integer[] datas = { 0, 1, 2, 3, 4, 5, 6, 7 };195 Tree<Integer> tree = new Tree<Integer>(datas);196 test(tree, "preOrderViste", visitor);197 test(tree, "inOrderViste", visitor);198 test(tree, "postOrderViste", visitor);199 test(tree, "inOrderViste", visitor);200 test(tree, "recursionInOrder", visitor);201 test(tree, "recursionPreOrder", visitor);202 test(tree, "recursionPostOrder", visitor);203 test(tree, "levelViste", visitor);204 }205 }
[转载]
http://www.cnblogs.com/fengfenggirl/p/tree_visite.html
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。