From b5b56f06c0faa6e95925b8e63108be882e955b2f Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 18 Nov 2020 08:32:26 +0800 Subject: [PATCH 1/8] =?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 17e141d1d560ea7fee5c628e6149351b04bc1a60 Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 25 Nov 2020 08:21:00 +0800 Subject: [PATCH 2/8] Add insert function --- BinaryTree.java | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/BinaryTree.java b/BinaryTree.java index 44fcb01..1a6a48e 100644 --- a/BinaryTree.java +++ b/BinaryTree.java @@ -2,14 +2,40 @@ import java.util.Queue; import java.util.LinkedList; -public class BinaryTree { +public class BinaryTree { public Node root; BinaryTree(){ root = null; } - void insert(T val){} + public void insert(T val){ + Node newNode = new Node(val); + + Node pointer = root; + while(pointer != null){ + // if(val < pointer.value){ + if(val.compareTo(pointer.value) < 0 ){ + if(temp.left == null){ + pointer.left = newNode; + break; + } else { + pointer = pointer.left; + } + } else { + if(temp.right == null){ + pointer.right = newNode; + break; + } else { + pointer = pointer.right; + } + } + } + if(pointer == null){ + root = newNode; + } + } + /* * 10 -- Gitee From 2b86df8b8be7e3407437d21c9a29823af86910a2 Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 25 Nov 2020 08:23:00 +0800 Subject: [PATCH 3/8] [refactor] by using insert function --- Main.java | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/Main.java b/Main.java index d394f77..3e37311 100644 --- a/Main.java +++ b/Main.java @@ -2,28 +2,18 @@ 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; + /* + * 10 + * 5 15 + * 3 7 12 20 + */ + Integer[] inputList = new Integer[]{10, 5, 15, 3, 7, 12, 20}; + for (int i = 0; i < inputList.length; i++) { + bt.insert(inputList[i]); + } + /* preOrder: 10 5 3 7 15 12 20 + */ bt.preOrder(); } } \ No newline at end of file -- Gitee From 439014e7e68b83bc0b28344bc6d5ea13cfc133f1 Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 25 Nov 2020 08:41:43 +0800 Subject: [PATCH 4/8] update README.md. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8ec588d..557af44 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ ### 基础 -1. 实现⼀个⼆叉查找树,并且支持插⼊、删除、查找操作 -2. 实现⼆叉树前、中、后序以及按层遍历 +1. 实现二叉查找树,并且支持插入、删除、查找操作 +2. 实现二叉树前、中、后序以及按层遍历 ### 进阶 -- Gitee From 2675563e18e1855f115e0c9172a52ff8c59d1944 Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 25 Nov 2020 09:20:01 +0800 Subject: [PATCH 5/8] Add delete function --- BinaryTree.java | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/BinaryTree.java b/BinaryTree.java index 1a6a48e..4301984 100644 --- a/BinaryTree.java +++ b/BinaryTree.java @@ -71,4 +71,81 @@ public class BinaryTree { public void inOrder(){} public void postOrder(){} public void level(){} + + /* + Delete: + 1. 找到被删除的节点及其父节点 + 2. 三种删除分别处理 + */ + public void delete(T val){ + if(root == null){ + return ; + } + + // 1. 找到被删除的节点及其父节点 + Node parent = root; + Node current = root; + while(current != null){ + if(val.compareTo(current.value) == 0){ + break; + } else if (val.compareTo(current.value) < 0){ + parent = current; + current = current.left; + } else { + parent = current; + current = current.right; + } + } + //整个while结束之后有2种情况 + // 1. 找到了 current != null, parent也有 + // 2. 没找到 current == null + if(current != null){ + // case 1: leaf node, 0 child + if(current.left == null && current.right == null){ + // 1.1 root case + if(current == root){ + root = null; + } + // 1.2 non-root case + else { + if(parent.left == current){ + parent.left = null; + } else { + parent.right = null; + } +// current.left = null; +// current.right = null; + } + } + // case 2: only 1 child + else if(current.left == null || current.right == null){ + + } + // case 3: 2 children + else { + // option 1: 被删节点的左子树的最大值来替换 + // option 2: 被删节点的右子树的最小值来替换 + Node leftRoot = current.left; + T maxValue = findLeftMaxAndDelete(leftRoot); + current.value = maxValue; + } + } + } + + private T findLeftMaxAndDelete(Node root){ + Node parent = root; + Node current = root; + while(current != null && current.right != null){ + parent = current; + current = current.right; + } + //找到最大值 + if(current != null){ + // 删除操作 + parent.right = null; + return current.value; + } else { + return null; + } + } } \ No newline at end of file -- Gitee From 681f6ff64464a26fbe029457c5684eceb80b51cb Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 25 Nov 2020 09:33:37 +0800 Subject: [PATCH 6/8] [fix] bug temp -> pointer --- BinaryTree.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BinaryTree.java b/BinaryTree.java index 4301984..08cb7be 100644 --- a/BinaryTree.java +++ b/BinaryTree.java @@ -16,14 +16,14 @@ public class BinaryTree { while(pointer != null){ // if(val < pointer.value){ if(val.compareTo(pointer.value) < 0 ){ - if(temp.left == null){ + if(pointer.left == null){ pointer.left = newNode; break; } else { pointer = pointer.left; } } else { - if(temp.right == null){ + if(pointer.right == null){ pointer.right = newNode; break; } else { -- Gitee From efea2b9542267116132d6d59aaf9366f135e0e08 Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 25 Nov 2020 09:35:49 +0800 Subject: [PATCH 7/8] [fix] delete mechanism in findLeftMaxAndDelete function --- BinaryTree.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/BinaryTree.java b/BinaryTree.java index 08cb7be..7d26d66 100644 --- a/BinaryTree.java +++ b/BinaryTree.java @@ -142,7 +142,13 @@ public class BinaryTree { //找到最大值 if(current != null){ // 删除操作 - parent.right = null; + if(current.left != null){ + parent.right = current.left; + } else { + parent.right = null; + } + // parent.right = current.left ? current.left : null; + return current.value; } else { return null; -- Gitee From 73f092220f4e76ed88ccb1c9bb38e2a3175607f0 Mon Sep 17 00:00:00 2001 From: zan Date: Wed, 25 Nov 2020 11:23:29 +0800 Subject: [PATCH 8/8] update README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 557af44..569ee70 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ### 截止日期 -下次实验课上课前(11.25) +更新:下次实验课上课前(12.02) ### 基础 -- Gitee