From 9e3dcf27b1d4f560f2b8a0355a6d50f0bb8fab3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8F=8B=E8=B5=9F?= <1483244272@qq.com> Date: Wed, 25 Nov 2020 10:40:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tree/BinaryTree.java | 260 +++++++++++++++++++++++++++++++++++++++++++ tree/Main.java | 43 +++++++ tree/Node.java | 13 +++ 3 files changed, 316 insertions(+) create mode 100644 tree/BinaryTree.java create mode 100644 tree/Main.java create mode 100644 tree/Node.java diff --git a/tree/BinaryTree.java b/tree/BinaryTree.java new file mode 100644 index 0000000..041690b --- /dev/null +++ b/tree/BinaryTree.java @@ -0,0 +1,260 @@ +package tree; + +import java.util.List; +import java.util.LinkedList; +import java.util.Queue; + +public class BinaryTree { + private static final String List = null; + // 二叉树根节点 + public Node root; + // 数组队列 + public int maxSize = 15; + public Node[] queue; + public int front; + public int rear; + + // 构造器 + BinaryTree() { + root = null; + } + + /* + * 10 5 15 3 7 12 20 preOrder: 10 5 3 7 15 12 20 + */ + // 先序 + public void preOrderTraversal() { + preOrder(root); + System.out.print("\n"); + } + + // 中序 + public void inOrderTraversal() { + inOrder(root); + System.out.print("\n"); + } + + // 后序 + public void postOrderTraversal() { + postOrder(root); + System.out.print("\n"); + } + + // 层序 + public void levelOrderTraversal() { + levelOrder(root); + System.out.print("\n"); + } + + // 查找 + public void find(int value) { + Node in = new Node(value); + findsearch(in, root); + System.out.print("\n"); + } + + // 插入 + public void insert(int value) { + Node in = new Node(value); + insertsearch(in, root); + } + + // 删除 + public void delete(int value) { + Node in = new Node(value); + deletesearch(in, root); + } + + /*-----------------------------------------------*/ + // 先序 + public void preOrder(Node tree) { + if (tree != null) { + System.out.print(tree.value + " "); + preOrder(tree.left); + preOrder(tree.right); + } + } + + // 中序 + public void inOrder(Node tree) { + if (tree != null) { + inOrder(tree.left); + System.out.print(tree.value + " "); + inOrder(tree.right); + } + } + + // 后序 + public void postOrder(Node tree) { + if (tree != null) { + postOrder(tree.left); + postOrder(tree.right); + System.out.print(tree.value + " "); + } + } + + // 层序 + public void levelOrder(Node tree) { + if (tree != null) { + Queue queue = new LinkedList<>(); + queue.add(tree); + while (!isEmpty()) { + Node temp = queue.remove(); + System.out.print(temp.value + " "); + if (temp.left != null) + queue.add(temp.left); + if (temp.right != null) + queue.add(temp.right); + } + } + } + + // 队空 + public boolean isEmpty() { + return front == rear; + } + + // 入队 + public void add(Node value) { + queue[rear] = value; + rear = (rear + 1) % maxSize; + } + + // 出队 + public Node remove() { + Node value = queue[front]; + front = (front + 1) % maxSize; + return value; + } + + /*-----------------------------------------------*/ + // 查找 + public boolean findsearch(Node value, Node tree) { + while (tree != null) { + if (value == tree.value) + return (true); + else if (value < tree.value) + tree = tree.left; + else + tree = tree.right; + } + return (false); + } + + // 插入 + public void insertsearch(Node item, Node tree) { + Node temp = tree; + Node temp2 = getParent(tree, root); + if (temp == null) { + temp = item; + } else { + while (temp != null) { + if (item.value == temp.value) + return; + else if (item.value < temp.value) + temp = temp.left; + else + temp = temp.right; + } + if (temp2.left == temp) + temp2.left = item; + else + temp2.right = item; + } + } + + // 删除 + public void deletesearch(Node item, Node tree){ + Node temp=item;//删除节点 + Node temp1=tree;//辅助定位 + Node temp2;//父节点 + Node temp3;//最小值最大值 + if(temp1 != null) + while(temp1 != null) { + if(temp.value==temp1.value) + if(temp1.left==null&&temp1.right==null) { + //没孩子 + temp2=getParent(temp1,tree); + if(temp2.left==temp.value) + temp2.left= null; + else + temp2.right= null; + }else if(temp1.left!=null&&temp1.right!=null) { + //只有左孩子,查找最大值; + temp3=getmax(temp1); + //删除最大值; + temp2=getParent(temp3,tree); + temp2.right= null; + //将要删除节点替换成最大值 + temp3.left=temp1.left; + temp2=getParent(temp1,tree); + if(temp2.left==temp1.value) + temp2.left= temp1; + else + temp2.right= temp1; + }else if(temp1.left==null&&temp1.right!=null) { + //只有右孩子,最小值; + temp3=getmin(temp1); + //删除最小值; + temp2=getParent(temp3,tree); + temp2.left= null; + //将要删除节点替换成最小值 + temp3.right=temp1.right; + temp2=getParent(temp1,tree); + if(temp2.left==temp1.value) + temp2.left= temp1; + else + temp2.right= temp1; + }else { + //有左右两个孩子,左孩子找最大值,孩子找最小值;就当做只有右孩子对待,最小值; + temp3=getmin(temp1); + //删除最小值; + temp2=getParent(temp3,tree); + temp2.left= null; + //将要删除节点替换成最小值 + temp3.right=temp1.right; + temp2=getParent(temp1,tree); + if(temp2.left==temp1.value) + temp2.left= temp1; + else + temp2.right= temp1; + } + else if (temp.value < temp1.value) + temp1 = temp1.left; + else + temp1 = temp1.right; + } + //释放删除的节点,回收内存;不会,等会了再补回来吧! + } + + // 查找父节点 + public Node getParent(Node item, Node tree) { + if (root == null || root.left == item || root.right == item) + return root; + Node left = getParent(root.left, item); + if (left != null) + return left; + Node right = getParent(root.right, item); + if (right != null) + return right; + return left; + } + + // 查找最大值 + public Node getmax(Node item) { + Node temp = item; + while (temp.right != null) { + temp = temp.right; + } + return temp; + } + + // 查找最小值 + public Node getmin(Node item) { + Node temp = item; + while (temp.left != null) { + temp = temp.left; + } + return temp; + } +} \ No newline at end of file diff --git a/tree/Main.java b/tree/Main.java new file mode 100644 index 0000000..8216c76 --- /dev/null +++ b/tree/Main.java @@ -0,0 +1,43 @@ +package tree; + +class Main { + public static void main(String[] args){ + BinaryTree bt = new BinaryTree(); + + /* + * 10 + * 5 15 + * 3 7 12 20 + * preOrder: 10 5 3 7 15 12 20 + */ + //ڵ + Node node10 = new Node(10); + Node node5 = new Node(5); + Node node3 = new Node(3); + Node node7 = new Node(7); + Node node15 = new Node(15); + Node node12 = new Node(12); + Node node20 = new Node(20); + // + bt.root = node10; + node10.left = node5; + node10.right = node15; + node5.left = node3; + node5.right = node7; + node15.left = node12; + node15.right = node20; + // + bt.preOrderTraversal(); + bt.inOrderTraversal(); + bt.postOrderTraversal(); + bt.levelOrderTraversal(); + // + bt.find(15); + // + bt.insert(14); + //ɾ + bt.delete(12); + // + bt.preOrderTraversal(); + } +} \ No newline at end of file diff --git a/tree/Node.java b/tree/Node.java new file mode 100644 index 0000000..7c83dbf --- /dev/null +++ b/tree/Node.java @@ -0,0 +1,13 @@ +package tree; + +public class Node { + public T value; + public Node left; + public Node right; + + Node(T val){ + value = val; + left = null; + right = null; + } +} \ No newline at end of file -- Gitee