diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java index a362c78734..aaf8ea4dca 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java @@ -1,126 +1,155 @@ package com.johnChnia.coding2017.basic.tree; -import com.johnChnia.coding2017.basic.queue.Queue; +import java.util.List; +import java.util.Objects; + +import static org.apache.commons.lang3.ObjectUtils.compare; +import static org.apache.commons.lang3.ObjectUtils.max; /** - * Created by john on 2017/3/13. + * Created by john on 2017/5/27. + *

+ * 二叉树:每个节点最多只有两个分支--https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91 + * 二叉搜索树:https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%85%83%E6%90%9C%E5%B0%8B%E6%A8%B9 */ -public class BinarySearchTree { - - - /** - * The root node of tree. - */ - public BstNode root; +public class BinarySearchTree { - private Queue q = new Queue(); + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root) { + this.root = root; + } - private static class BstNode { - private int data; - private BstNode left; - private BstNode right; + public BinaryTreeNode getRoot() { + return root; + } - @Override - public String toString() { - return String.valueOf(data); + public T findMin() { + if (Objects.nonNull(root)) { + BinaryTreeNode node = root; + while (Objects.nonNull(node.getLeft())) { + node = node.getLeft(); + } + return node.getData(); } + return null; } - /** - * create an BinarySearchTree. - * - * @param root root node of tree - * @param data stored element - * @return binarySearchTree - */ - public BstNode insert(BstNode root, int data) { - if (root == null) { - root = getNewBstNode(data); - if (this.root == null) { - this.root = root; + public T findMax() { + if (Objects.nonNull(root)) { + BinaryTreeNode node = root; + while (Objects.nonNull(node.getRight())) { + node = node.getRight(); } - return root; - } - if (data <= root.data) { - root.left = insert(root.left, data); - } else { - root.right = insert(root.right, data); + return node.getData(); } - return root; + return null; } - private BstNode getNewBstNode(int data) { - BstNode node = new BstNode(); - node.data = data; - node.left = null; - node.right = null; - return node; + + public int height() { + if (Objects.nonNull(root)) { + return height(root); + } + return -1; } /** - * Returns the minimum value in the tree. + * Height of a node: Number of edges in longest path from the node to a leaf node + * Height of tree: Height of root + * Height of tree with 1 node: 0 + * Depth of a node: Number of edges in path from root to that node + * 树的高度:max(leftTree,rightTree)+ 1 * - * @param root root node of the tree。 - * @return the minimum value in the tree - * @throws IllegalArgumentException if root is null. + * @return 树的高度。 */ - public int findMin(BstNode root) { - int min; - if (root == null) { - throw new IllegalArgumentException("tree is empty"); - } else if (root.left == null) { - min = root.data; - } else { - min = findMin(root.left); + private int height(BinaryTreeNode root) { + if (Objects.isNull(root)) { + return 0; + } + int lheight = height(root.getLeft()); + int rheight = height(root.getRight()); + + return max(lheight, rheight) + 1; + } + + public int size() { + if (Objects.nonNull(root)) { + return size(root); } - return min; + return -1; } /** - * Returns the maximum value in the tree. + * 参考:http://www.geeksforgeeks.org/write-a-c-program-to-calculate-size-of-a-tree/ + * Size of a tree is the number of elements present in the tree. + * Size of a tree = Size of left subtree + 1 + Size of right subtree. * - * @param root root node of the tree。 - * @return the maximum value in the tree - * @throws IllegalArgumentException if root is null. + * @return 树的节点个数。 */ - public int findMax(BstNode root) { - int max; - if (root == null) { - throw new IllegalArgumentException("tree is empty"); - } else if (root.right == null) { - max = root.data; - } else { - max = findMax(root.right); + private int size(BinaryTreeNode root) { + if (Objects.isNull(root)) { + return 0; } - return max; + + return 1 + size(root.getLeft()) + size(root.getRight()); } + public void remove(T e) { + if (Objects.nonNull(e)) { + remove(root, e); + } + } + /** - * Traverse each node from left to right. + * http://www.geeksforgeeks.org/binary-search-tree-set-2-delete/ * - * @param root root node of the tree + * @param root 根节点 + * @param e 删除节点 */ - public void LevelOrder(BstNode root) { - if (root == null) { - return; - } - q.add(root); - while (!q.empty()) { - BstNode current = (BstNode) q.peek(); - if (current.left != null) { - q.add(current.left); - } - if (current.right != null) { - q.add(current.right); + private BinaryTreeNode remove(BinaryTreeNode root, T e) { + int flag = compare(e, root.data); + if (flag > 0) { + root.right = remove(root.getRight(), e); + } else if (flag < 0) { + root.left = remove(root.getLeft(), e); + } else { + // 叶子节点 + if (Objects.isNull(root.getLeft()) && Objects.isNull(root.getRight())) { + return null; + } else if (Objects.isNull(root.getLeft())) { // 只有一个子节点 + return root.getRight(); + } else if (Objects.isNull(root.getRight())) { + return root.getLeft(); } - q.remove(); + //两个子节点 + BinarySearchTree temp = new BinarySearchTree<>(root.getRight()); + T data = temp.findMin(); + remove(root, data); + root.data = data; } + return root; } - public BstNode getRoot() { - return root; + public List levelVisit() { + + return null; + } + + public boolean isValid() { + return false; + } + + public T getLowestCommonAncestor(T n1, T n2) { + return null; + + } + + public List getNodesBetween(T n1, T n2) { + return null; } } + + diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java index 968d386717..1383a1e5c9 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java @@ -1,38 +1,66 @@ package com.johnChnia.coding2017.basic.tree; -import com.johnChnia.coding2017.basic.tree.BinarySearchTree; +import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.junit.MatcherAssert.assertThat; - /** - * Created by john on 2017/3/14. + * Created by john on 2017/5/27. */ public class BinarySearchTreeTest { - - private BinarySearchTree bst; + BinarySearchTree tree = null; @Before public void setUp() throws Exception { - bst = new BinarySearchTree(); - bst.insert(bst.getRoot(), 10); - bst.insert(bst.getRoot(), 20); - bst.insert(bst.getRoot(), 9); - bst.insert(bst.getRoot(), 11); - bst.insert(bst.getRoot(), 12); + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + } @Test - public void testFindMin() throws Exception { - assertThat(bst.findMin(bst.getRoot()), equalTo(9)); + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); } @Test - public void testFindMax() throws Exception { - assertThat(bst.findMax(bst.getRoot()), equalTo(20)); + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root = tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); + } -} \ No newline at end of file + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root = tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } +}