根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建、搜索、删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度和其它的一些方法等完成了再继续更新:
二叉树的java实现:
1 package com.peter.java.dsa.common; 2 3 import java.util.ArrayList; 4 5 public class BinaryTree { 6 private TreeNode root; 7 private int size = 0; 8 9 public BinaryTree() { 10 // TODO Auto-generated constructor stub 11 } 12 13 public BinaryTree(int value) { 14 // TODO Auto-generated constructor stub 15 this.root = new TreeNode(value); 16 this.size = 1; 17 } 18 19 public TreeNode getRoot() { 20 return root; 21 } 22 23 public int getMax() { 24 TreeNode node = root; 25 while (node.rightChildNode != null) { 26 node = node.rightChildNode; 27 } 28 return node.value; 29 } 30 31 public int getMin() { 32 TreeNode node = root; 33 while (node.leftChildNode != null) { 34 node = node.leftChildNode; 35 } 36 return node.value; 37 } 38 39 public void preOrderTreeWalk(TreeNode node, ArrayList<Integer> container) { 40 if (node != null) { 41 container.add(node.value); 42 preOrderTreeWalk(node.leftChildNode, container); 43 preOrderTreeWalk(node.rightChildNode, container); 44 } 45 } 46 47 public void midOrderTreeWalk(TreeNode node, ArrayList<Integer> container) { 48 if (node != null) { 49 midOrderTreeWalk(node.leftChildNode, container); 50 container.add(node.value); 51 midOrderTreeWalk(node.rightChildNode, container); 52 } 53 } 54 55 public void postOrderTreeWalk(TreeNode node, ArrayList<Integer> container) { 56 if (node != null) { 57 postOrderTreeWalk(node.leftChildNode, container); 58 postOrderTreeWalk(node.rightChildNode, container); 59 container.add(node.value); 60 } 61 } 62 63 public TreeNode search(int value) { 64 TreeNode node = root; 65 while (node.value != value) { 66 if (value < node.value) { 67 node = node.leftChildNode; 68 } else { 69 node = node.rightChildNode; 70 } 71 if (node == null) { 72 node = null; 73 } 74 } 75 return node; 76 } 77 78 private TreeNode findParentNode(int value) { 79 TreeNode parent = null; 80 TreeNode node = root; 81 while (node.value != value) { 82 parent = node; 83 if (value < node.value) { 84 node = node.leftChildNode; 85 } else { 86 node = node.rightChildNode; 87 } 88 if (node == null) { 89 node = null; 90 parent = null; 91 } 92 } 93 return parent; 94 } 95 96 public void createBinaryTree(int[] data) { 97 if (data != null) { 98 for (int i : data) { 99 insert(i); 100 } 101 } 102 } 103 104 public void insert(int value) { 105 if (root == null) { 106 root = new TreeNode(value); 107 } else { 108 TreeNode curNode = root; 109 TreeNode parentNode; 110 while (true) { 111 parentNode = curNode; 112 if (value < curNode.value) { 113 curNode = curNode.leftChildNode; 114 if (curNode == null) { 115 parentNode.leftChildNode = new TreeNode(value); 116 parentNode.leftChildNode.leftOrRight = -1; 117 break; 118 } 119 } else { 120 curNode = curNode.rightChildNode; 121 if (curNode == null) { 122 parentNode.rightChildNode = new TreeNode(value); 123 parentNode.rightChildNode.leftOrRight = 1; 124 break; 125 } 126 } 127 } 128 } 129 ++size; 130 } 131 132 public boolean delete(int value) { 133 boolean flag = false; 134 TreeNode node = search(value); 135 TreeNode parent = findParentNode(value); 136 if (node != null) { 137 if (node.equals(root)) { 138 root = null; 139 } 140 if (node.leftChildNode == null && node.rightChildNode == null) { 141 if (node.leftOrRight == 1) { 142 node = null; 143 parent.rightChildNode = null; 144 } 145 if (node.leftOrRight == -1) { 146 node = null; 147 parent.leftChildNode = null; 148 } 149 } else if (node.leftChildNode != null 150 && node.rightChildNode != null) { 151 TreeNode successor = findSuccessor(node); 152 if (node.leftOrRight == -1) { 153 parent.leftChildNode = successor; 154 parent.leftChildNode.leftOrRight = -1; 155 } 156 if (node.leftOrRight == 1) { 157 parent.rightChildNode = successor; 158 parent.rightChildNode.leftOrRight = 1; 159 } 160 successor.leftChildNode = node.leftChildNode; 161 } else { 162 if (node.leftChildNode != null) { 163 if (node.leftOrRight == 1) { 164 parent.rightChildNode = node.leftChildNode; 165 } 166 if (node.leftOrRight == -1) { 167 parent.leftChildNode = node.leftChildNode; 168 } 169 } 170 if (node.rightChildNode != null) { 171 if (node.leftOrRight == 1) { 172 parent.rightChildNode = node.rightChildNode; 173 } 174 if (node.leftOrRight == -1) { 175 parent.leftChildNode = node.rightChildNode; 176 } 177 } 178 node = null; 179 } 180 flag = true; 181 --size; 182 } 183 return flag; 184 } 185 186 private TreeNode findSuccessor(TreeNode delNode) { 187 TreeNode parent = delNode; 188 TreeNode successor = delNode; 189 TreeNode curNode = delNode.rightChildNode; 190 191 while (curNode != null) { 192 parent = successor; 193 successor = curNode; 194 curNode = curNode.leftChildNode; 195 } 196 if (!successor.equals(delNode.rightChildNode)) { 197 parent.leftChildNode = successor.rightChildNode; 198 successor.rightChildNode = delNode.rightChildNode; 199 } 200 return successor; 201 } 202 203 public int size() { 204 return this.size; 205 } 206 207 public boolean isEmpty() { 208 // TODO Auto-generated method stub 209 return size == 0; 210 } 211 212 public class TreeNode { 213 int leftOrRight = 0;// 0: root;-1:left child node;1, right childe node; 214 Integer value; 215 TreeNode leftChildNode; 216 TreeNode rightChildNode; 217 218 public TreeNode(Integer value) { 219 // TODO Auto-generated constructor stub 220 this.value = value; 221 } 222 223 @Override 224 public boolean equals(Object obj) { 225 // TODO Auto-generated method stub 226 if (obj instanceof TreeNode) { 227 TreeNode node = (TreeNode) obj; 228 return node.value == this.value; 229 } 230 return false; 231 } 232 233 @Override 234 public String toString() { 235 return "TreeNode [leftOrRight=" 236 + leftOrRight 237 + ", value=" 238 + value 239 + (leftChildNode != null ? ", leftChildNode=" 240 + leftChildNode : "") 241 + (rightChildNode != null ? ", rightChildNode=" 242 + rightChildNode : "") + "]"; 243 } 244 } 245 }
测试代码如下:
1 package com.peter.java.dsa.test; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 6 import com.peter.java.dsa.common.BinaryTree; 7 import com.peter.java.dsa.common.BinaryTree.TreeNode; 8 9 public class Test { 10 11 /** 12 * @param args 13 */ 14 public static void main(String[] args) { 15 // TODO Auto-generated method stub 16 int[] data = { 21, 25, 16, 32, 22, 19, 13, 20 }; 17 System.out.println("input: " + Arrays.toString(data)); 18 BinaryTree bTree = new BinaryTree(); 19 System.out.println(bTree.isEmpty() + "--" + bTree.size()); 20 bTree.createBinaryTree(data); 21 System.out.println(bTree.isEmpty() + "--" + bTree.size()); 22 ArrayList<Integer> container = new ArrayList<Integer>(); 23 TreeNode root = bTree.getRoot(); 24 container.clear(); 25 bTree.preOrderTreeWalk(root, container); 26 System.out.println("pre Order Binary Tree Walk: " 27 + container.toString()); 28 container.clear(); 29 bTree.midOrderTreeWalk(root, container); 30 System.out.println("mid Order Binary Tree Walk: " 31 + container.toString()); 32 container.clear(); 33 bTree.postOrderTreeWalk(root, container); 34 System.out.println("post Order Binary Tree Walk: " 35 + container.toString()); 36 System.out.println("Max Value: " + bTree.getMax()); 37 System.out.println("Max Value: " + bTree.getMin()); 38 // change the function findParentNode() to be private 39 // TreeNode parent = bTree.findParentNode(25); 40 // if (parent != null) { 41 // System.out.println("Parent Value: " + parent.toString()); 42 // } 43 // delete a node which has no child nodes, successfully 44 // bTree.delete(13); 45 // container.clear(); 46 // bTree.midOrderTreeWalk(root, container); 47 // System.out.println("mid Order Binary Tree Walk: " 48 // + container.toString()); 49 // container.clear(); 50 // bTree.postOrderTreeWalk(root, container); 51 // System.out.println("post Order Binary Tree Walk: " 52 // + container.toString()); 53 // delete a node which has a right child node, successfully 54 // bTree.delete(19); 55 // container.clear(); 56 // bTree.preOrderTreeWalk(root, container); 57 // System.out.println("pre Order Binary Tree Walk: " 58 // + container.toString()); 59 // container.clear(); 60 // bTree.midOrderTreeWalk(root, container); 61 // System.out.println("mid Order Binary Tree Walk: " 62 // + container.toString()); 63 64 // delete a node which has a right child node, successfully 65 bTree.delete(16); 66 container.clear(); 67 bTree.preOrderTreeWalk(root, container); 68 System.out.println("pre Order Binary Tree Walk: " 69 + container.toString()); 70 container.clear(); 71 bTree.midOrderTreeWalk(root, container); 72 System.out.println("mid Order Binary Tree Walk: " 73 + container.toString()); 74 } 75 }