From 7c8ca020d5490579250ac2c646a9538b752c100c Mon Sep 17 00:00:00 2001 From: null796 <982254607@qq.com> Date: Tue, 24 Nov 2020 23:31:31 +0800 Subject: [PATCH] =?UTF-8?q?BinartTree=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BinarySearchTree/BinarySearchTree.java | 137 +++++++++++++++++++++ BinarySearchTree/BinarySearchTreeMain.java | 25 ++++ BinarySearchTree/TreeNode.java | 31 +++++ BinaryTree/BinaryTree.java | 137 +++++++++++++++++++++ BinaryTree/Main.java | 42 +++++++ BinaryTree/Node.java | 13 ++ 6 files changed, 385 insertions(+) create mode 100644 BinarySearchTree/BinarySearchTree.java create mode 100644 BinarySearchTree/BinarySearchTreeMain.java create mode 100644 BinarySearchTree/TreeNode.java create mode 100644 BinaryTree/BinaryTree.java create mode 100644 BinaryTree/Main.java create mode 100644 BinaryTree/Node.java diff --git a/BinarySearchTree/BinarySearchTree.java b/BinarySearchTree/BinarySearchTree.java new file mode 100644 index 0000000..dfee228 --- /dev/null +++ b/BinarySearchTree/BinarySearchTree.java @@ -0,0 +1,137 @@ +package BinarySearchTree; + +public class BinarySearchTree { + static class Node { + public int val; + public Node left; + public Node right; + + public Node(int val) { + this.val = val; + } + } + Node root = null; + public void put(int val) { + Node node = new Node(val); + //第一次插入,root == null + if(root == null) { + root = node; + return; + } + //不是第一次插入 root != null + Node pre = null;//用来指向cur的父亲节点 + Node cur = root; + while (cur != null) { + //去右边找 + if (cur.val < val) { + pre = cur;//记录下此时cur + cur = pre.right;//cur向右节点移动 + }else if (cur.val > val) {//该去左边找 + pre = cur; + cur = pre.left; + }else {//已经有相等的值,则不做任何处理,直接退出 + return; + } + } + //此时cur = null,pre = cur的根节点 + //判断当前val和pre的val大小,决定插入左边还是右边 + if (pre.val < val) {//插入到右节点 + pre.right = node; + }else {//插入到左节点 + pre.left = node; + } + } + public Node get(int val) { + Node cur = root; + while (cur != null) { + //找到该节点 + if (cur.val == val) { + return cur; + }else if (cur.val < val) {//去右边找 + cur = cur.right; + }else {//去左边找 + cur = cur.left; + } + } + //说明没找到 + return null; + } + //删除 + public boolean remove(int val) { + Node cur = root;//当前结点 + Node pre = null;//当前节点的根节点 + //先找到要删除的节点 + while (cur != null) { + if (cur.val == val) { + break; + }else if (cur.val < val) { + pre = cur; + cur = pre.right; + }else { + pre = cur; + cur = pre.left; + } + } + //判断是否找到 + //cur为null,说明没有找到 + if (cur == null) return false; + //说明找到了cur,开始判断cur的位置 + if (cur.left == null) { + if (cur == root) {//是根节点 + root = cur.right;//替换 + }else {//不是根节点 + if (cur == pre.left) { + pre.left = cur.right; + }else { + pre.right = cur.right; + } + } + }else if (cur.right == null) { + if (cur == root) { + root = cur.left; + }else { + if (cur == pre.left) { + pre.left = cur.left; + }else { + pre.right = cur.left; + } + } + }else {//cur的左右节点都不为null + Node minPre = cur;//指向cur下一节点的根节点 + Node minCur = cur.right;//cur的下一个节点 + while (minCur.left != null) { + minPre = minCur; + minCur = minPre.left; + } + cur.val = minCur.val;//先覆盖掉原来节点 + //判断下一节点在根节点的哪一边 + if (minCur == minPre.left) { + minPre.left = minCur.right;//再覆盖掉原来的下一节点 + }else { + minPre.right = minCur.right; + } + } + return true; + } + //前序遍历 + public void preOrder(Node root) { + if (root == null) return; + System.out.print(root.val + " "); + preOrder(root.left); + preOrder(root.right); + } + //中序遍历 + public void inOrder(Node root) { + if (root == null) return; + inOrder(root.left); + System.out.print(root.val + " "); + inOrder(root.right); + } + //后序遍历 + public void aftOrder(Node root) { + if (root == null) return; + preOrder(root.left); + preOrder(root.right); + System.out.print(root.val + " "); + } +} diff --git a/BinarySearchTree/BinarySearchTreeMain.java b/BinarySearchTree/BinarySearchTreeMain.java new file mode 100644 index 0000000..7e88f0b --- /dev/null +++ b/BinarySearchTree/BinarySearchTreeMain.java @@ -0,0 +1,25 @@ +package BinarySearchTree; + +public class BinarySearchTreeMain { + public static void main(String[] args) { + int[] arr = {7,5,45,9,26,41,2,6}; + BinarySearchTree binarySearchTree = new BinarySearchTree(); + for (int i = 0; i < arr.length; i++) { + binarySearchTree.put(arr[i]); + } + binarySearchTree.preOrder(binarySearchTree.root); + System.out.println(); + binarySearchTree.inOrder(binarySearchTree.root); + System.out.println(); + binarySearchTree.aftOrder(binarySearchTree.root); + System.out.println(); + try { + System.out.println(binarySearchTree.get(45).val); + }catch (NullPointerException e) { + e.printStackTrace(); + System.out.println("閿欒"); + } + System.out.println(binarySearchTree.remove(45)); + binarySearchTree.inOrder(binarySearchTree.root); + } +} diff --git a/BinarySearchTree/TreeNode.java b/BinarySearchTree/TreeNode.java new file mode 100644 index 0000000..5b80d2d --- /dev/null +++ b/BinarySearchTree/TreeNode.java @@ -0,0 +1,31 @@ +package BinarySearchTree; + +/** + * Definition for a binary tree node. + */ +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + TreeNode(int x) { + val = x; + } +} +class Solution { + public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { + //递归结束条件 + if (root == null || p == null) { + return null; + } + //如果p的值大于等于根结点,说明p的后继节点在当前root的右子树中 + if (p.val >= root.val) { + //在当前root的右子树中查找 + return inorderSuccessor(root.right, p); + } else {//如果p的值小于根结点,说明p的后继节点在当前root的左子树中 + //查找当前root的左子树 + TreeNode left = inorderSuccessor(root.left, p); + //如果当前root的左子树中没有找到(左孩子为空时)则返回当前root,否则逐层返回left + return left == null ? root : left; + } + } +} \ No newline at end of file diff --git a/BinaryTree/BinaryTree.java b/BinaryTree/BinaryTree.java new file mode 100644 index 0000000..761d60c --- /dev/null +++ b/BinaryTree/BinaryTree.java @@ -0,0 +1,137 @@ +package BinaryTree; + +import java.util.Queue; +import java.util.LinkedList; + +public class BinaryTree { + public Node root; + + public 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 root){ + if(root != null) { + // root.value // 10 打印自身 + System.out.print(root.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(){ inOrderTraversal(root); } + + /* + * 10 + * 5 15 + * 3 7 12 20 + * preOrder: 3 5 7 10 12 15 20 + */ + private void inOrderTraversal(Node root){ + if(root != null) { + + + // 打印10左子树 + inOrderTraversal(root.left); + // root.left.left.value // 3 + // root.left.value // 5 + // root.left.right.value // 7 + + // root.value // 10 打印自身 + System.out.print(root.value); + System.out.print(" "); + + // 打印右子树 + inOrderTraversal(root.right); + // root.right.left.value // 12 + // root.right.value // 15 + // root.right.right.value // 20 + } + } + public void postOrder(){postOrderTraversal(root);} + + /* + * 10 + * 5 15 + * 3 7 12 20 + * preOrder: 3 7 5 12 20 15 10 + */ + + private void postOrderTraversal(Node root){ + if(root != null) { + + + // 打印10左子树 + postOrderTraversal(root.left); + // root.left.left.value // 3 + // root.left.right.value // 7 + // root.left.value // 5 + + + + // 打印右子树 + postOrderTraversal(root.right); + // root.right.left.value // 12 + // root.right.right.value // 20 + // root.right.value // 15 + + // root.value // 10 打印自身 + System.out.print(root.value); + System.out.print(" "); + } + } + public void level(){ + levelTraversal(root); //root指向10 + } + + //层次遍历 + /* + * 1.把根放到队列中, + * 2.循环直到队列为空 + * 3.把队首结点取出 + * 4.把队首结点的左右孩子取出(没有得话,不插入) + */ + public static void levelTraversal(Node root){ + if(root==null){ + return; + } + + Queue queue=new LinkedList<>(); + queue.add(root); + + while(!queue.isEmpty()){ + Node front=queue.remove(); + System.out.print(front.value+" "); + + if(front.left!=null){ + queue.add(front.left); + } + if(front.right!=null){ + queue.add(front.right); + } + } + + } +} \ No newline at end of file diff --git a/BinaryTree/Main.java b/BinaryTree/Main.java new file mode 100644 index 0000000..38818bf --- /dev/null +++ b/BinaryTree/Main.java @@ -0,0 +1,42 @@ +package BinaryTree; + +public 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; + + System.out.print("先序遍历:"); + bt.preOrder(); + System.out.println(); + System.out.print("中序遍历:"); + bt.inOrder(); + System.out.println(); + System.out.print("后序遍历:"); + bt.postOrder(); + System.out.println(); + System.out.print("层序遍历:"); + bt.level(); + System.out.println(); + } +} \ No newline at end of file diff --git a/BinaryTree/Node.java b/BinaryTree/Node.java new file mode 100644 index 0000000..3d2d2ad --- /dev/null +++ b/BinaryTree/Node.java @@ -0,0 +1,13 @@ +package BinaryTree; + +public class Node { + public T value; + public Node left; + public Node right; + + public Node(T val){ + value = val; + left = null; + right = null; + } +} \ No newline at end of file -- Gitee