diff --git a/BinaryTree.java b/BinaryTree.java new file mode 100644 index 0000000000000000000000000000000000000000..e4f69c3787d170bbbe3979420a7df91f7d99776d --- /dev/null +++ b/BinaryTree.java @@ -0,0 +1,229 @@ +public class BinaryTree { + private Node root; + + /** + * 插入新元素 + * @param data + */ + public void insertData(Integer data) { + Node node = new Node(data); + Node root = this.root; + if (root == null) { + this.root = node; + System.out.println("添加:" + node); + return; + } + insertData(root,node); + } + + /** + * 先序遍历 + */ + public void leftPrint() { + if (this.root == null) { + System.out.println("此二叉树为空"); + return; + } + System.out.print("前序遍历:"); + leftPrint(this.root); + System.out.println(" "); + } + + /** + * 中序遍历 + */ + public void midPrint() { + if (this.root == null) { + System.out.println("此二叉树为空"); + return; + } + System.out.print("中序遍历:"); + midPrint(this.root); + System.out.println(" "); + } + + /** + * 后序遍历 + */ + public void rightPrint() { + if (this.root == null) { + System.out.println("此二叉树为空"); + return; + } + System.out.print("后序遍历:"); + rightPrint(this.root); + System.out.println(" "); + } + + /** + * 层次遍历(但是没写 + */ + public void levelPrint() { + System.out.println(this.root); + } + + /** + * + * @param data + */ + public void deleteData(Integer data) { + deleteData(this.root,data); + } + + /** + * 删除操作:遍历节点,找到目标值。若目标值存在右子树,则目标值以右子树的最小值代替,若无最小值,则目标值等于左节点 + * @param root + * @param data + */ + private void deleteData(Node root,Integer data) { + if (root.getData().equals(data)) { + if (root.getRight()!=null) { + if (root.getRight().getLeft() == null && root.getRight().getRight() == null) { + root.setData(root.getRight().getData()); + root.setRight(null); + return; + }else if (root.getRight().getLeft() == null && root.getRight().getRight() != null){ + Integer temp = root.getRight().getData(); + System.out.println("删除:" + temp); + root.setData(temp); + root.setRight(root.getRight().getRight()); + return; + }else { + Integer temp = getLeftEnd(root.getRight()); + System.out.println(temp); + System.out.println("删除:" + root.getData()); + root.setData(temp); + return; + } + } + if (root.getLeft() != null) { + if (root.getLeft().getLeft() == null && root.getLeft().getRight() == null) { + root.setData(root.getLeft().getData()); + root.setLeft(null); + return; + }else if (root.getLeft().getLeft() == null && root.getLeft().getRight() != null){ + Integer temp = root.getLeft().getData(); + System.out.println("删除:" + temp); + root.setData(temp); + root.setLeft(root.getRight().getRight()); + return; + }else { + Integer temp = getLeftEnd(root.getLeft()); + System.out.println(temp); + System.out.println("删除:" + root.getData()); + root.setData(temp); + return; + } + } + System.out.println("删除:" + root.getData()); + root = null; + }else if (root.getData() > data) { + if (root.getLeft().getData().equals(data)&&root.getLeft().getLeft() == null && root.getLeft().getRight() == null) { + System.out.println("删除:" + root.getLeft().getData()); + root.setLeft(null); + return; + } + deleteData(root.getLeft(),data); + }else if (root.getData() < data) { + if (root.getRight().getData().equals(data)&&root.getRight().getLeft() == null && root.getRight().getRight() == null) { + System.out.println("删除:" + root.getRight().getData()); + root.setRight(null); + return; + } + deleteData(root.getRight(),data); + } + } + + /** + * + * @param root + */ + private void leftPrint(Node root) { + System.out.print(root.getData() + " "); + if (root.getLeft() != null) { + leftPrint(root.getLeft()); + } + if (root.getRight() != null){ + leftPrint(root.getRight()); + } + } + + /** + * + * @param root + * @param data + */ + private void insertData(Node root,Node data) { + if (root.getData().equals(data.getData())) { + System.out.println("已存在相同"); + } + if (root.getData() < data.getData()) { + if (root.getRight() == null) { + root.setRight(data); + System.out.println("添加:" + data); + return; + } + insertData(root.getRight(),data); + }else if (root.getData() > data.getData()) { + if (root.getLeft() == null) { + root.setLeft(data); + System.out.println("添加:" + data); + return; + } + insertData(root.getLeft(),data); + } + } + + /** + * + * @param root + */ + private void midPrint(Node root) { + if (root.getLeft() != null) { + midPrint(root.getLeft()); + } + System.out.print(root.getData() + " "); + if (root.getRight() != null) { + midPrint(root.getRight()); + } + } + + /** + * + * @param root + */ + private void rightPrint(Node root) { + if (root.getLeft() != null) { + rightPrint(root.getLeft()); + } + if (root.getRight() != null) { + rightPrint(root.getRight()); + } + System.out.print(root.getData() + " "); + } + + /** + * 删除当前节点的最左节点,并返回。 + * @param root + * @return 当前节点的最左节点 + */ + private Integer getLeftEnd(Node root) { + Integer temp = null; + if (root.getLeft() != null) { + if (root.getLeft().getLeft() != null) { + getLeftEnd(root.getLeft()); + } + temp = root.getLeft().getData(); + root.setLeft(null); + return temp; + }else if (root.getRight() != null) { + temp = root.getData(); + root = root.getRight(); + return temp; + } + temp = root.getData(); + root.setData(null); + return temp; + } +} + diff --git a/MainTest.java b/MainTest.java new file mode 100644 index 0000000000000000000000000000000000000000..15bf32d188b3f0422146113e70dd87e4808fe30b --- /dev/null +++ b/MainTest.java @@ -0,0 +1,21 @@ +public class MainTest { + public static void main(String[] args) { + BinaryTree binaryTree = new BinaryTree(); + binaryTree.insertData(5); + binaryTree.insertData(3); + binaryTree.insertData(7); + binaryTree.insertData(6); + binaryTree.insertData(4); + binaryTree.insertData(2); + binaryTree.insertData(1); + binaryTree.insertData(9); + binaryTree.insertData(8); + binaryTree.insertData(10); + binaryTree.leftPrint(); + binaryTree.deleteData(8); + binaryTree.leftPrint(); + binaryTree.midPrint(); + binaryTree.rightPrint(); + binaryTree.levelPrint(); + } +} \ No newline at end of file diff --git a/Node.java b/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..f03165cf9b4226c83ed226306686a6904ff19aed --- /dev/null +++ b/Node.java @@ -0,0 +1,45 @@ +public class Node { + private Integer data; + private Node left; + private Node right; + + public Node() { + } + + public Node(Integer data) { + this.data = data; + } + + public Integer getData() { + return data; + } + + public void setData(Integer data) { + this.data = data; + } + + public Node getLeft() { + return left; + } + + public void setLeft(Node left) { + this.left = left; + } + + public Node getRight() { + return right; + } + + public void setRight(Node right) { + this.right = right; + } + + @Override + public String toString() { + return "Node{" + + "data=" + data + + ", left=" + left + + ", right=" + right + + '}'; + } +} \ No newline at end of file