標籤:後續遍曆 sem 空間 turn null treenode key 後序遍曆 左右子樹
public class Tree { private TreeNode root = null; public Tree() { root = new TreeNode(1, "A"); } private class TreeNode { private int key; private String data; private boolean isVisted; private TreeNode leftChild; private TreeNode rightChild; public TreeNode(int key, String data) { this.key = key; this.data = data; this.leftChild = null; this.rightChild = null; this.isVisted = false; } } /** * 建立一顆二叉樹 * A * B C * D E F * createBinTree:(). * @author 衛健 * @param root */ public void createBinTree(TreeNode root) { TreeNode newNodeB = new TreeNode(2, "B"); TreeNode newNodeC = new TreeNode(3, "C"); TreeNode newNodeD = new TreeNode(4, "D"); TreeNode newNodeE = new TreeNode(5, "E"); TreeNode newNodeF = new TreeNode(6, "F"); root.leftChild = newNodeB; root.rightChild = newNodeC;// newNodeC.rightChild = newNodeF;// newNodeB.leftChild = newNodeD;// newNodeB.rightChild = newNodeE; root.rightChild.rightChild = newNodeF; root.leftChild.leftChild = newNodeD; root.leftChild.rightChild = newNodeE; } public boolean isEmpty() { return root == null; } //樹的高度 public int height() { return height(root); } //節點個數 public int size() { return size(root); } private int height(TreeNode subTree) { if (subTree == null) return 0; int i = height(subTree.leftChild); int j = height(subTree.rightChild); return i < j ? j + 1 : i + 1; } private int size(TreeNode subTree) { if (subTree == null) return 0; return 1 + size(subTree.leftChild) + size(subTree.rightChild); } //返回雙親節點 public TreeNode parent(TreeNode element) { return (root == null || root == element) ? null : parent(root, element); } public TreeNode parent(TreeNode subTree, TreeNode element) { if (subTree == null) return null; if (subTree.leftChild == element || subTree.rightChild == element) { //返回父節點地址 return subTree; } TreeNode p; //先在左子樹中尋找,如果左子樹中沒有找到,則到右子樹中尋找 if ((p = parent(subTree.leftChild, element)) != null) return p; //遞迴左子樹中搜尋 else return parent(subTree.rightChild, element); } public TreeNode getLeftChildNode(TreeNode element) { return element != null ? element.leftChild : null; } public TreeNode getRightChildNode(TreeNode element) { return element != null ? element.rightChild : null; } public TreeNode getRoot() { return root; } //在釋放某個節點時,該節點的左右子樹都已經釋放, //所以應該採用後續遍曆,當訪問某個節點時將該節點的儲存空間釋放 public void distroy(TreeNode subTree) { //刪除根為subTree的子樹 if (subTree != null) { //刪除左子樹 distroy(subTree.leftChild); //刪除右子樹 distroy(subTree.rightChild); //刪除根節點 subTree = null; } } public void traverse(TreeNode subTree) { System.out.println("key:" + subTree.key + "--name:" + subTree.data); traverse(subTree.leftChild); traverse(subTree.rightChild); } //前序走訪 public void perOrder(TreeNode subTree) { if (subTree != null) { visted(subTree); perOrder(subTree.leftChild); perOrder(subTree.rightChild); } } //中序遍曆 public void inOrder(TreeNode subTree) { if (subTree != null) { perOrder(subTree.leftChild); visted(subTree); perOrder(subTree.rightChild); } } //後序遍曆 public void postOrder(TreeNode subTree) { if (subTree != null) { perOrder(subTree.leftChild); perOrder(subTree.rightChild); visted(subTree); } } //將二叉樹鏡面對稱 public void mirror(TreeNode subTree) { if (subTree == null) return; TreeNode node = new TreeNode(subTree.key, subTree.data); node.leftChild = subTree.leftChild; subTree.leftChild = subTree.rightChild; subTree.rightChild = node.leftChild; mirror(subTree.leftChild); mirror(subTree.rightChild); } public void visted(TreeNode subTree) { subTree.isVisted = true; System.out.println("key:" + subTree.key + "---data:" + subTree.data); } //測試 public static void main(String[] args) { Tree bt = new Tree(); bt.createBinTree(bt.root); System.out.println(bt.size() + "---size"); System.out.println(bt.height() + "---height"); System.out.println("**************前序走訪************"); bt.perOrder(bt.root); System.out.println("************鏡面對稱**前序走訪************"); bt.mirror(bt.root); bt.perOrder(bt.root);// System.out.println("**************中序遍曆************");// bt.inOrder(bt.root);// // System.out.println("**************後序遍曆************");// bt.postOrder(bt.root); } }
java二叉樹實現代碼