From 51b5c672fd75b61142388a6f0e0ad1aaac1393a2 Mon Sep 17 00:00:00 2001 From: Li <1254705596@qq.com> Date: Tue, 24 Nov 2020 23:00:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BST.java | 147 ++++++++++++++++++++++++++++++++++++++++++++ src/BSTMain.java | 12 ++++ src/BinaryTree.java | 44 +++++++++++++ src/Main.java | 27 ++++++++ src/Node.java | 11 ++++ 5 files changed, 241 insertions(+) create mode 100644 src/BST.java create mode 100644 src/BSTMain.java create mode 100644 src/BinaryTree.java create mode 100644 src/Main.java create mode 100644 src/Node.java diff --git a/src/BST.java b/src/BST.java new file mode 100644 index 0000000..0dc0960 --- /dev/null +++ b/src/BST.java @@ -0,0 +1,147 @@ +import java.util.LinkedList; +import java.util.Queue; + +public class BST { + static class TreeNode { + public int value; + public TreeNode left; + public TreeNode right; + + public TreeNode(int item) { + this.value = value; + + } + } + + public TreeNode root; + + public TreeNode searach(int item) { // 查找 + TreeNode current = root; + while (current != null && current.value != item) { + if (item < current.value) { + current = current.left; + } else if (item > current.value) { + current = current.right; + } + } + return current == null ? null : current; + } + + public void insert(int item) { + if (root == null) { + root = new TreeNode(item); + } + TreeNode current = root; //插入的位置 初始值root为根节点 + TreeNode parent = null; + while (true) { //插入一个节点都是从根节点开始比的 + parent = current; + if (item < parent.value) { + current = parent.left; + if (current == null) { + parent.left = new TreeNode(item); + return; + } + } else if (item > parent.value) { + current = parent.right; + if (current == null) { + parent.right = new TreeNode(item); + return; + } + } + } + } + + public boolean delete(int item) { + TreeNode parent = root; + TreeNode current = root; + boolean isLeftChild = false; //判断是父节点的左孩子,还是右孩子 + while (current != null && current.value != item) { + parent = current; + if (current.value > item) { + isLeftChild = true; + current = current.left; + } else { + isLeftChild = false; + current = current.right; + + } + + if (current == null) { + return false; + } + if (current.left == null && current.right == null) { //如果是叶子节点的话,直接删除即可 + if (current == root) { + root = null; + } else if (isLeftChild) { + parent.left = null; + } else { + parent.right = null; + } + } else if (current.right == null) { //只有一个孩子的情况下 + if (current == root) { + root = current.left; //如果是头结点,那么删除,左节点成为新的头结点 + } else if (isLeftChild) { + parent.left = current.left; + } else { + parent.right = current.left; + } + } else if (current.left == null) { + if (current == root) { + root = current.right; + } else if (isLeftChild) { + parent.left = current.right; + } else { + parent.right = current.right; + } + } else { + TreeNode successor = getSuccessor(current); + if (current == root) { + root = successor; + } else if (isLeftChild) { + parent.left = successor; + } else { + parent.right =successor; + } + successor.left = current.left; + } + + } + return true; + } + private TreeNode getSuccessor(TreeNode node){ //z找一个新节点替换要被删除的节点 + TreeNode successor = null; + TreeNode successorParent = null; + TreeNode current = node.right; + while (current != null){ + successorParent = successor; //右节点给successor + successor = current; + current = current.left; + } + if(successor !=node.right){ + successorParent.left = successor.right; + successor.right = node.right; + } + return successor; + } +public void level(TreeNode target){ + Queue queue=new LinkedList<>(); + if(target==null){ + return ; + } + TreeNode temp; + queue.add(target); + while (!queue.isEmpty()){ + temp=queue.remove(); + System.out.printf(temp.value+"===>"); + if(temp.left!=null){ + queue.add(temp.left); + } + if(temp.right!=null){ + queue.add(temp.right); + } + } +} +} + + + diff --git a/src/BSTMain.java b/src/BSTMain.java new file mode 100644 index 0000000..4c57fc2 --- /dev/null +++ b/src/BSTMain.java @@ -0,0 +1,12 @@ +public class BSTMain { + public static void main(String[] args) { + BST bst = new BST(); + bst.insert(5); + bst.insert(10); + bst.insert(3); + bst.searach(6); + System.out.println(); + bst.delete(6); + System.out.println(); + } +} diff --git a/src/BinaryTree.java b/src/BinaryTree.java new file mode 100644 index 0000000..348d32a --- /dev/null +++ b/src/BinaryTree.java @@ -0,0 +1,44 @@ +public class BinaryTree { + public Node root; + + void BinaryTree(){ + root = null; + } + void insert(T value){} + + public void preOrder(){ //公开的 + System.out.println("前序遍历:"); + preOrderTraversal(root); + + } + public void midOrder(){ + System.out.println("中序遍历:"); + midOrderTraversal(root); + } + + public void postOrder(){ + System.out.println("后序遍历:"); + postOrderTraversal(root); + } + private void preOrderTraversal(Node tree){ + if(tree != null){ + System.out.println(tree.value); + preOrderTraversal(tree.left); + preOrderTraversal(tree.right); + } + } + private void midOrderTraversal(Node tree){ + if(tree != null){ + midOrderTraversal(tree.left); + System.out.println(tree.value); + midOrderTraversal(tree.right); + } + } + private void postOrderTraversal(Node tree) { + if (tree != null) { + postOrderTraversal(tree.left); + postOrderTraversal(tree.right); + System.out.println(tree.value); + } + } +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..5d283db --- /dev/null +++ b/src/Main.java @@ -0,0 +1,27 @@ +public class Main { + public static void main(String[] args) { + BinaryTree Btree = new BinaryTree(); + Btree.root = new Node(10); + Node left1 = new Node(5); + Btree.root.left = left1; + Node right1 = new Node(15); + Btree.root.right = right1; + + Node left21 = new Node(3); + left1.left = left21; + Node left22 = new Node(7); + left1.right = left22; + + Node left23 = new Node(12); + right1.left = left23; + Node left24 = new Node(20); + right1.right = left24; + + Btree.preOrder(); //前序遍历 + System.out.println(); + Btree.midOrder(); //中序遍历 + System.out.println(); + Btree.postOrder(); //后序遍历 + + } +} diff --git a/src/Node.java b/src/Node.java new file mode 100644 index 0000000..8dd1d70 --- /dev/null +++ b/src/Node.java @@ -0,0 +1,11 @@ +public class Node { + public T value; + Node left; + Node right; + + public Node(T value){ + this.value = value; + left = null; + right = null; + } +} -- Gitee