一、分析
一個二叉樹節點有三個部分,一個是指向左子樹的部分,一個是指向右子樹的部分,另外一個是數據部分。可以把這個節點抽象成一個節點對象,給對象有兩個節點對象屬性和一個數據屬性。如下圖:
一個二叉樹有只有一個根節點,其余的都是根節點的直接或間接子節點。所以可以把二叉樹抽象成一個對象,該對象有一個節點類型的數據,也就是用來保存根節點。如下圖:
二、代碼
1 package com.algorithms.treee; 2 3 /** 4 * 二叉樹 5 */ 6 public class BinaryTree 7 { 8 private TreeNode root;// 根節點 9 10 public BinaryTree() 11 { 12 } 13 14 public BinaryTree(TreeNode root) 15 { 16 this.root = root; 17 } 18 19 public TreeNode getRoot() 20 { 21 return root; 22 } 23 24 public void setRoot(TreeNode root) 25 { 26 this.root = root; 27 } 28 29 /** 30 * 定義節點 31 */ 32 private static class TreeNode 33 { 34 private String data = null;// 數據部分 35 private TreeNode left;// 左節點的引用 36 private TreeNode right;// 右節點的引用 37 38 public TreeNode() 39 { 40 } 41 42 public TreeNode(String data, TreeNode left, TreeNode right) 43 { 44 this.data = data; 45 this.left = left; 46 this.right = right; 47 } 48 49 public String getData() 50 { 51 return data; 52 } 53 54 public void setData(String data) 55 { 56 this.data = data; 57 } 58 59 public TreeNode getLeft() 60 { 61 return left; 62 } 63 64 public void setLeft(TreeNode left) 65 { 66 this.left = left; 67 } 68 69 public TreeNode getRight() 70 { 71 return right; 72 } 73 74 public void setRight(TreeNode right) 75 { 76 this.right = right; 77 } 78 79 } 80 81 /** 82 * 返回父結點 83 * 84 * @param element 85 * @return 86 */ 87 public TreeNode getParent(TreeNode element) 88 { 89 return (root == null || root == element) ? null : parent(root, element); 90 } 91 92 public TreeNode parent(TreeNode subTree, TreeNode element) 93 { 94 if (subTree == null) 95 return null; 96 if (subTree.getLeft() == element || subTree.getRight() == element) 97 // 返回父結點地址 98 return subTree; 99 TreeNode p; 100 // 現在左子樹中找,如果左子樹中沒有找到,才到右子樹去找 101 if ((p = parent(subTree.getLeft(), element)) != null) 102 // 遞歸在左子樹中搜索 103 return p; 104 else 105 // 遞歸在右子樹中搜索 106 return parent(subTree.getRight(), element); 107 } 108 109 /** 110 * 節點個數 111 * 112 * @return 113 */ 114 public int getSize() 115 { 116 return getNum(root); 117 } 118 119 private int getNum(TreeNode node) 120 { 121 if (node == null) 122 { 123 return 0; 124 } 125 else 126 { 127 int i = getNum(node.getLeft()); 128 int j = getNum(node.getRight()); 129 return j + i + 1; 130 } 131 } 132 133 /** 134 * 樹高度 135 * 136 * @return 137 */ 138 public int getHeight() 139 { 140 return getHeight(root); 141 } 142 143 private int getHeight(TreeNode node) 144 { 145 if (node == null) 146 return 0;// 遞歸結束:空樹高度為0 147 else 148 { 149 int i = getHeight(node.getLeft()); 150 int j = getHeight(node.getRight()); 151 return (i < j) ? (j + 1) : (i + 1); 152 } 153 } 154 155 /** 156 * 前序遍歷 157 * 158 * @param node 159 */ 160 public void preOrder(TreeNode node) 161 { 162 if (node != null) 163 { 164 System.out.println(node.getData()); 165 preOrder(node.getLeft()); 166 preOrder(node.getRight()); 167 } 168 } 169 170 /** 171 * 中序遍歷 172 * 173 * @param node 174 */ 175 public void inOrder(TreeNode node) 176 { 177 if (node != null) 178 { 179 inOrder(node.getLeft()); 180 System.out.println(node.getData()); 181 inOrder(node.getRight()); 182 } 183 } 184 185 /** 186 * 后續遍歷 187 * 188 * @param node 189 */ 190 public void postOrder(TreeNode node) 191 { 192 if (node != null) 193 { 194 postOrder(node.getLeft()); 195 postOrder(node.getRight()); 196 System.out.println(node.getData()); 197 } 198 } 199 200 public static void main(String[] args) 201 { 202 203 TreeNode l12 = new TreeNode("left12", null, null); 204 TreeNode r12 = new TreeNode("right12", null, null); 205 TreeNode l22 = new TreeNode("left22", null, null); 206 TreeNode r22 = new TreeNode("right22", null, null); 207 208 TreeNode l1 = new TreeNode("left1", l12, r12);// 根節點左子樹 209 TreeNode r1 = new TreeNode("right1", l22, r22);// 根節點右子樹 210 TreeNode root = new TreeNode("root", l1, r1);// 創建根節點 211 212 BinaryTree bt = new BinaryTree(root); 213 System.out.println("=======先序遍歷======"); 214 bt.preOrder(bt.getRoot()); 215 System.out.println("=======中序遍歷======"); 216 bt.inOrder(bt.getRoot()); 217 System.out.println("========后續遍歷======="); 218 bt.postOrder(bt.getRoot()); 219 System.out.println("==========="); 220 System.out.println(bt.getHeight()); 221 System.out.println(bt.getSize()); 222 223 System.out.println(bt.getParent(r22).getData()); 224 } 225 }