From b5b56f06c0faa6e95925b8e63108be882e955b2f Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 18 Nov 2020 08:32:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[add]=20=E5=85=88=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BinaryTree.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ Main.java | 29 +++++++++++++++++++++++++++++ Node.java | 11 +++++++++++ 3 files changed, 88 insertions(+) create mode 100644 BinaryTree.java create mode 100644 Main.java create mode 100644 Node.java diff --git a/BinaryTree.java b/BinaryTree.java new file mode 100644 index 0000000..44fcb01 --- /dev/null +++ b/BinaryTree.java @@ -0,0 +1,48 @@ +// 写层序遍历用 +import java.util.Queue; +import java.util.LinkedList; + +public class BinaryTree { + public Node root; + + BinaryTree(){ + root = null; + } + + void insert(T val){} + + /* + * 10 + * 5 15 + * 3 7 12 20 + * preOrder: 10 5 3 7 15 12 20 + */ + public void preOrder(){ + preOrderTraversal(root); + } + + private void preOrderTraversal(Node tree){ + if(tree != null) { + // root.value // 10 打印自身 + System.out.print(tree.value); + System.out.print(" "); + + // 打印10左子树 + preOrderTraversal(root.left) + // root.left.value // 5 + // root.left.left.value // 3 + // root.left.right.value // 7 + + // 打印右子树 + preOrderTraversal(root.right) + // root.right.value // 15 + // root.right.left.value // 12 + // root.right.right.value // 20 + } + } + + + public void inOrder(){} + public void postOrder(){} + public void level(){} +} \ No newline at end of file diff --git a/Main.java b/Main.java new file mode 100644 index 0000000..d394f77 --- /dev/null +++ b/Main.java @@ -0,0 +1,29 @@ +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 + */ + bt.root = new Node(10); + Node left1 = new Node(5); + bt.root.left = left1; + Node right1 = new Node(15); + bt.root.right = right1; + + Node left21 = new Node(3); + left1.left = left21; + Node left22 = new Node(7); + left1.right = left22; + + Node left23 = new Node(12); + Node left24 = new Node(20); + right1.left = left23; + right1.right = left24; + + bt.preOrder(); + } +} \ No newline at end of file diff --git a/Node.java b/Node.java new file mode 100644 index 0000000..d845786 --- /dev/null +++ b/Node.java @@ -0,0 +1,11 @@ +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 From 77864cf1a0ea15b9a09847a21b2ba9aa9c2dde59 Mon Sep 17 00:00:00 2001 From: qiuyizhi Date: Wed, 25 Nov 2020 00:09:05 +0800 Subject: [PATCH 2/2] zuoye --- BinaryTree.java | 244 +++++++++++++++++++++++++++++++++++++++++------- Main.java | 51 +++++----- 2 files changed, 242 insertions(+), 53 deletions(-) diff --git a/BinaryTree.java b/BinaryTree.java index 44fcb01..c418f3c 100644 --- a/BinaryTree.java +++ b/BinaryTree.java @@ -1,48 +1,228 @@ -// 写层序遍历用 + import java.util.Queue; import java.util.LinkedList; -public class BinaryTree { - public Node root; - - BinaryTree(){ +public class BinaryTree { + public Node root; + BinaryTree() { root = null; } - void insert(T val){} + public void insert(String val) { + Node newNode = new Node<>(val); + if (root == null) { + root = newNode; + return; + } + Node markNode = root; + Node underNode; + while (true) { + underNode = markNode; + if (Integer.valueOf(newNode.value) > Integer.valueOf(markNode.value)) { + + markNode = markNode.right; + if (markNode == null) { + underNode.right = newNode; + return; + } + } else { + + markNode = markNode.left; + if (markNode == null) { + underNode.left = newNode; + return; + } + } + } + } + + + public boolean select(String val) { + if (root == null) { + return false; + } + Node markNode = root; + while (true) { + if (markNode.value.equals(val)) { + return true; + } + if (Integer.valueOf(val) > Integer.valueOf(markNode.value)) { + + markNode = markNode.right; + } else { + + markNode = markNode.left; + } + if (markNode == null) { + return false; + } + } + } + + + public boolean remove(String val) { + if (root == null) { + return false; + } + + Node markNode = root; + Node underNode = null; + String direction = ""; + while (true) { + if (markNode.value.equals(val)) { + + if (markNode.right == null && markNode.left == null) { + //1.无子节点 + if (underNode == null) { + //删除根节点 无子节点 + root = null; + return true; + } + //没有自节点直接删除 + if (direction.length() > 0) { + if (direction.equals("left")) { + underNode.left = null; + } else if (direction.equals("right")) { + underNode.right = null; + } + } + } else if (markNode.right == null || markNode.left == null) { + + Node newNode = null; + if (markNode.right != null) { + + newNode = markNode.right; + } else { + + newNode = markNode.left; + } + + if (underNode == null) { + + root = newNode; + return true; + } + + + if (direction.length() > 0) { + if (direction.equals("left")) { + underNode.left = newNode; + } else if (direction.equals("right")) { + underNode.right = newNode; + } + } + + } else { + + Node maxNode = markNode.left; + Node topNode=null; + while (maxNode.right != null) { + topNode = maxNode; + maxNode = maxNode.right; + } + + if (topNode != null) { + topNode.right = maxNode.left; + }else { + markNode.left=maxNode.left; + } - /* - * 10 - * 5 15 - * 3 7 12 20 - * preOrder: 10 5 3 7 15 12 20 - */ - public void preOrder(){ + maxNode.left=null; + maxNode.right=markNode.right; + maxNode.left=markNode.left; + + if (underNode == null){ + + root=maxNode; + return true; + } + if (direction.length() > 0) { + if (direction.equals("left")) { + underNode.left = maxNode; + } else if (direction.equals("right")) { + underNode.right = maxNode; + } + } + + } + return true; + } + underNode = markNode; + if (Integer.valueOf(val) > Integer.valueOf(markNode.value)) { + + markNode = markNode.right; + direction = "right"; + } else { + + markNode = markNode.left; + direction = "left"; + } + if (markNode == null) { + return false; + } + } + + + } + + + public void preOrder() { preOrderTraversal(root); } - private void preOrderTraversal(Node tree){ - if(tree != null) { - // root.value // 10 打印自身 - System.out.print(tree.value); - System.out.print(" "); - // 打印10左子树 - preOrderTraversal(root.left) - // root.left.value // 5 - // root.left.left.value // 3 - // root.left.right.value // 7 - - // 打印右子树 - preOrderTraversal(root.right) - // root.right.value // 15 - // root.right.left.value // 12 - // root.right.right.value // 20 + private void preOrderTraversal(Node tree) { + if (tree != null) { + + System.out.print(tree.value + " "); + preOrderTraversal(tree.left); + preOrderTraversal(tree.right); + } + } + + public void inOrder() { + inOrderTraversal(root); + } + + + private void inOrderTraversal(Node tree) { + if (tree != null) { + + inOrderTraversal(tree.left); + System.out.print(tree.value + " "); + inOrderTraversal(tree.right); } } + public void postOrder() { + postOrderTraversal(root); + } + - public void inOrder(){} - public void postOrder(){} - public void level(){} + private void postOrderTraversal(Node tree) { + if (tree != null) { + + postOrderTraversal(tree.left); + postOrderTraversal(tree.right); + System.out.print(tree.value + " "); + } + } + + public void level() { + if (root == null) { + return; + } + Queue queue = new LinkedList<>(); + queue.add(root); + while (!queue.isEmpty()) { + Node item = queue.remove(); + System.out.print(item.value + " "); + if (item.left != null) { + queue.add(item.left); + } + if (item.right != null) { + queue.add(item.right); + } + } + } } \ No newline at end of file diff --git a/Main.java b/Main.java index d394f77..07bde04 100644 --- a/Main.java +++ b/Main.java @@ -1,29 +1,38 @@ 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 - */ - bt.root = new Node(10); - Node left1 = new Node(5); - bt.root.left = left1; - Node right1 = new Node(15); - bt.root.right = right1; + BinaryTree bt = new BinaryTree(); - Node left21 = new Node(3); - left1.left = left21; - Node left22 = new Node(7); - left1.right = left22; + bt.insert("24"); + bt.insert("22"); + bt.insert("26"); + bt.insert("21"); + bt.insert("23"); + bt.insert("25"); + bt.insert("27"); - Node left23 = new Node(12); - Node left24 = new Node(20); - right1.left = left23; - right1.right = left24; bt.preOrder(); + System.out.println(); + bt.inOrder(); + System.out.println(); + bt.postOrder(); + System.out.println(); + bt.level(); + System.out.println(); + System.out.println("查询19是存在"+bt.select("19")); + System.out.println("查询20是存在"+bt.select("20")); + System.out.println("查询21是存在"+bt.select("21")); + System.out.println("查询22是存在"+bt.select("22")); + bt.level(); + System.out.println(); + bt.remove("24"); + bt.level(); + System.out.println(); + bt.remove("26"); + bt.level(); + + + + } } \ No newline at end of file -- Gitee