树是在实际编程中经常遇到的数据结构,它的逻辑很简单:除了根节点以外,每个节点只有一个父节点,根节点没有父节点;除了叶节点之外所有节点都有一个或多个子节点,叶节点没有子节点。
树的前、中、后序遍历是比较基础,同时也是必须要掌握的几个点,它们分别有递归、和非递归的解法。递归相对简单一点,非递归相对复杂一些。
下面用Java语言分别实现树的前、中、后序递归遍历,另外这边拓展(递归创建二叉树、求树的深度)两个解法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| package BiTree;
import java.util.Scanner;
public class BiTree {
private Object data; private BiTree lChild; private BiTree rChild;
public BiTree(Object data,BiTree lChild,BiTree rChild){ this.data = data; this.lChild = lChild; this.rChild = rChild; }
public static void inOrderTraverse(BiTree tree){ if(tree != null) { inOrderTraverse(tree.lChild); System.out.print(tree.data); inOrderTraverse(tree.rChild); } }
public static void afterOrderTraverse(BiTree tree){ if(tree != null){ afterOrderTraverse(tree.lChild); afterOrderTraverse(tree.rChild); System.out.print(tree.data); } }
public static void preOrderTraverse(BiTree tree){ if(tree != null){ System.out.print(tree.data); preOrderTraverse(tree.lChild); preOrderTraverse(tree.rChild); } }
public static BiTree createBiTree(Scanner scanner) throws Exception{ int data = scanner.nextInt(); if(data == 0){ return null; }else{ return new BiTree(data,createBiTree(scanner),createBiTree(scanner)); } }
public static Integer depth(BiTree tree){ if(tree == null){ return 0; }else{ Integer m = depth(tree.lChild); Integer n = depth(tree.rChild); if(m > n){ return m+1; }else{ return n+1; } }
}
public static void main(String []args) throws Exception{ BiTree tree = createBiTree(new Scanner(System.in)); System.out.println(); System.out.println("--------------递归:中序遍历二叉数------------------"); inOrderTraverse(tree); System.out.println(); System.out.println("--------------递归:先序遍历二叉数------------------"); preOrderTraverse(tree); System.out.println(); System.out.println("--------------递归:后序遍历二叉数------------------"); afterOrderTraverse(tree);
System.out.println(); System.out.println("--------------递归:求二叉树的深度------------------"); System.out.println(depth(tree)); }
}
|
参考:参考: Data Structure (2nd Edition) 第五章http://book.knowsky.com/book_1030305.htm