diff --git a/lec05-tree.iml b/lec05-tree.iml new file mode 100644 index 0000000000000000000000000000000000000000..b107a2dd81165eaaf682ad3da030668b937fbb6c --- /dev/null +++ b/lec05-tree.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/co/A.java b/src/co/A.java new file mode 100644 index 0000000000000000000000000000000000000000..1998d455fbdbd4411ce32f13aece3da7fa66179e --- /dev/null +++ b/src/co/A.java @@ -0,0 +1,7 @@ +package co; + +public class A { + public static void main(String[] args) { + + } +} diff --git a/src/co/BinaryTree.java b/src/co/BinaryTree.java new file mode 100644 index 0000000000000000000000000000000000000000..bb8b0d1e87ab0b5743ef50079b655d54f4d11388 --- /dev/null +++ b/src/co/BinaryTree.java @@ -0,0 +1,38 @@ +package src.co; + +public class BinaryTree { + public TreeNode root; + + + public void setRoot(TreeNode root ) { + this.root = root; + } + + public void PreOrder() { + if (this.root != null) { + this.root.PreOrder(); + } + } + + public void MidOrder() { + if (this.root != null) { + this.root.MidOrder(); + } + } + + public void RearOrder() { + if (this.root != null) { + this.root.RearOrder(); + } + } + + public void insertTree(TreeNode node) { + if (this.root == null) { + this.root = node; + } else { + this.root.insertTree(node); + } + } + + +} \ No newline at end of file diff --git a/src/co/BinaryTreeDemo.java b/src/co/BinaryTreeDemo.java new file mode 100644 index 0000000000000000000000000000000000000000..7b4128afa652425d4d40a67518df171baad941fc --- /dev/null +++ b/src/co/BinaryTreeDemo.java @@ -0,0 +1,42 @@ +package src.co; + + + +public class BinaryTreeDemo { + public static void main(String[] args) { + BinaryTree binaryTree = new BinaryTree(); + TreeNode root = new TreeNode(7); + + // 二叉树 + // TreeNode node1 = new TreeNode(2); + // TreeNode node2 = new TreeNode(3); + // TreeNode node3 = new TreeNode(4); + // TreeNode node4 = new TreeNode(5); + // root.setLeft(node1); + // root.setRight(node2); + // node1.setLeft(node3); + // node1.setRight(node4); + // binaryTree.setRoot(root); + // root.PreOrder(); + + // 查找二叉树 + root.insertTree(new TreeNode(3)); + root.insertTree(new TreeNode(10)); + root.insertTree(new TreeNode(12)); + root.insertTree(new TreeNode(5)); + root.insertTree(new TreeNode(1)); + root.insertTree(new TreeNode(16)); + root.insertTree(new TreeNode(11)); + root.insertTree(new TreeNode(14)); + root.insertTree(new TreeNode(18)); + + binaryTree.setRoot(root); + root.MidOrder(); + root.selectTree(new TreeNode(12)); + root.deleteTree(11); + root.PreOrder(); + + root.stepOrder(binaryTree.root); + + } +} diff --git a/src/co/TreeNode.java b/src/co/TreeNode.java new file mode 100644 index 0000000000000000000000000000000000000000..7e8d2e2e8e8df4bd5b340fe6692d8ce0ce436649 --- /dev/null +++ b/src/co/TreeNode.java @@ -0,0 +1,248 @@ +package src.co; + +import java.util.Queue; + +import java.util.LinkedList; + +public class TreeNode { + private int data; + + private TreeNode left; + private TreeNode right; + + public TreeNode(int data) { + this.data = data; + + } + + public void setNode(int data) { + this.data = data; + + } + + public int getNode() { + return data; + } + + public void setLeft(TreeNode left) { + this.left = left; + + } + + public TreeNode getLeft() { + return left; + } + + public void setRight(TreeNode right) { + this.right = right; + + } + + public TreeNode getright() { + return right; + } + + // 二叉树的前序遍历 中左右 + public void PreOrder() { + System.out.print(" " + this.data); + if (this.left != null) { + + this.left.PreOrder(); + } + + if (this.right != null) { + + this.right.PreOrder(); + } + } + + // 二叉树的中序遍历 左中右 + public void MidOrder() { + + if (this.left != null) { + + this.left.MidOrder(); + } + + System.out.print(" " + this.data); + + if (this.right != null) { + + this.right.MidOrder(); + } + } + + // 二叉树的后序排序 左右中 + public void RearOrder() { + if (this.left != null) { + + this.left.RearOrder(); + } + + if (this.right != null) { + + this.right.RearOrder(); + } + System.out.print(" " + this); + } + + // 层次遍历 + public void stepOrder(TreeNode Node) { + System.out.println(); + Queue order = new LinkedList<>(); + order.add(Node); + while (!order.isEmpty()) { + TreeNode node = order.poll(); + System.out.print(node.data + " "); + if (node.left != null) { + order.add(node.left); + } + if (null != node.right) { + order.add(node.right); + } + } + + } + + // 查找二叉树的插入 + public void insertTree(TreeNode node) { + if (node == null) { + return; + } else { + if (this.data < node.data) { + if (this.right == null) { + this.right = node; + } else { + this.right.insertTree(node); + } + } else { + if (this.left == null) { + this.left = node; + } else { + this.left.insertTree(node); + } + } + + } + + } + + public void selectTree(TreeNode node) { + if (node == null) { + return; + } else { + if (this.data == node.data) { + System.out.println(" 查找到" + this.data); + } else if (this.data > node.data) { + if (this.left == null) { + System.out.println("不存在"); + } else { + this.left.selectTree(node); + } + } else if (this.data < node.data) { + if (this.right == null) { + System.out.println("不存在"); + } else { + this.right.selectTree(node); + } + } + + } + + } + + // 删除两个子节点的目标节点: 查找目标节点 + public TreeNode searchChildNode(int data) { + if (data == this.data) { + return this; + } else if (data > this.data) { + if (this.right == null) { + return null; + } else { + return this.right.searchChildNode(data); + } + + } else { + if (this.left == null) { + return null; + } else { + return this.left.searchChildNode(data); + } + + } + + } + + // 删除有子节点的目标节点: 查找目标节点的父节点的方法 + + public TreeNode searchParentNode(int data) { + if (this.left != null && this.left.data == data || this.right != null && this.right.data == data) { + return this; + } else { + if (data > this.data && this.right != null) { + return this.right.searchParentNode(data); + } else if (data < this.data && this.left != null) { + return this.left.searchParentNode(data); + } else { + return null; + } + } + } + + // 查找目标节点的右子节点中的最小节点 + public int searchMinNde(TreeNode node) { + TreeNode target = node; + while (target.left != null) { + target = target.left; + } + deleteTree(target.data); + + return target.data; + + } + + public void deleteTree(int data) { + + TreeNode result = this.searchChildNode(data); + TreeNode parent = this.searchParentNode(data); + + // 删除叶子节点 + if (parent.left == result) { + if (result.left == null && result.right == null) { + parent.left = null; + } + } + if (parent.right == result) { + if (result.left == null && result.right == null) { + parent.right = null; + } + } + + /* + * 删除只有一个子节点的目标节点 有两种情况: (1) 子节点是目标节点的左子节点 (2) 子节点是目标节点的右子节点 + * + */ + if (result.left != null && result.right == null) { + parent.left = result.left; + } + if (result.left == null && result.right != null) { + parent.left = result.right; + + } + + if (result.left != null && result.right == null) { + parent.right = result.left; + } + if (result.left == null && result.right != null) { + parent.right = result.right; + + } + + // 删除两个节点的目标节点 + if (result.right != null && result.left != null) { + int nextMin = searchMinNde(result.right); + result.data = nextMin; + } + } + +}