diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree$BinaryNode.class" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree$BinaryNode.class" new file mode 100644 index 0000000000000000000000000000000000000000..acec880c044c63bb73f124e0d5cbf36a824191cc Binary files /dev/null and "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree$BinaryNode.class" differ diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree.class" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree.class" new file mode 100644 index 0000000000000000000000000000000000000000..ea0d4030d769add261e23fe5ac3931890816362f Binary files /dev/null and "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree.class" differ diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree.java" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree.java" new file mode 100644 index 0000000000000000000000000000000000000000..fd3236a1c4cc0c5be051b03a29bb8c75f8d6a0b4 --- /dev/null +++ "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\345\242\236\345\210\240\346\237\245/BinarySearchTree.java" @@ -0,0 +1,199 @@ +// package com.kiritor; +/** + * Java实现二叉查找树 + * @author Kiritor + * @param */ +public class BinarySearchTree> { + + /**结点数据结构*/ + static class BinaryNode + { + T data; + BinaryNode left; + BinaryNode right; + public BinaryNode(T data) { + this(data,null,null); + } + public BinaryNode( T data, BinaryNode left, BinaryNode right) { + this.data =data; + this.left = left; + this.right =right; + } + public BinaryNode() + { + data =null; + this.left = left; + this.right =right; + } + } + + private BinaryNode rootTree; + /**构造一颗空的二叉查找树*/ + public BinarySearchTree() + { + rootTree = null; + } + /**清空二叉查找树*/ + public void clear() + { + rootTree = null; + } + /**判断是否为空*/ + public boolean isEmpty() + { + return rootTree == null; + } + /**查找指定的元素,默认从 + * 根结点出开始查询*/ + public boolean contains(T t) + { + return contains(t, rootTree); + + } + /**找到二叉查找树中的最小值*/ + public T findMin() + { + if(isEmpty()) + { + System.out.println("二叉树为空"); + return null; + }else + return findMin(rootTree).data; + + } + /**找到二叉查找树中的最大值*/ + public T findMax() + { + if(isEmpty()) + { + System.out.println("二叉树为空"); + return null; + }else + return findMax(rootTree).data; + } + /**插入元素*/ + public void insert(T t) + { + rootTree = insert(t, rootTree); + } + /**删除元素*/ + public void remove(T t) + { + rootTree = remove(t,rootTree); + } + /**打印二叉查找树*/ + public void printTree() + { + + } + /**从某个结点出开始查找元素*/ + public boolean contains(T t, BinaryNode node) + { + if(node==null) + return false; + int result = t.compareTo(node.data); + if(result>0) + return contains(t,node.right); + else if(result<0) + return contains(t, node.left); + else + return true; + } + /**查询出最小元素所在的结点*/ + public BinaryNode findMin(BinaryNode node) + { + if(node==null) + return null; + else if(node.left==null) + return node; + return findMin(node.left);//递归查找 + } + /**查询出最大元素所在的结点*/ + public BinaryNode findMax(BinaryNode node) + { + if(node!=null) + { + while(node.right!=null) + node=node.right; + } + return node; + } + /**在某个位置开始判断插入元素*/ + public BinaryNode insert(T t,BinaryNode node) + { + if(node==null) + { + //新构造一个二叉查找树 + return new BinaryNode(t, null, null); + } + int result = t.compareTo(node.data); + if(result<0) + node.left= insert(t,node.left); + else if(result>0) + node.right= insert(t,node.right); + else + ;//doNothing + return node; + } + /**在某个位置开始判断删除某个结点*/ + public BinaryNode remove(T t,BinaryNode node) + { + if(node == null) + return node;//没有找到,doNothing + int result = t.compareTo(node.data); + if(result>0) + node.right = remove(t,node.right); + else if(result<0) + node.left = remove(t,node.left); + else if(node.left!=null&&node.right!=null) + { + node.data = findMin(node.right).data; + node.right = remove(node.data,node.right); + } + else + node = (node.left!=null)?node.left:node.right; + return node; + + } + public BinaryNode init() + { + BinaryNode node3 = new BinaryNode(3); + BinaryNode node1 = new BinaryNode(1); + BinaryNode node4 = new BinaryNode(4,node3,null); + BinaryNode node2 = new BinaryNode(2,node1,node4); + BinaryNode node8 = new BinaryNode(8); + BinaryNode root = new BinaryNode(6,node2,node8); + return root; + } + public void preOrder(BinaryNode node) { + if (node != null) { + System.out.print(node.data); + preOrder(node.left); + preOrder(node.right); + } + } + /*测试*/ + @SuppressWarnings("unchecked") + public static void main(String[] args) { + BinarySearchTree searchTree = new BinarySearchTree<>(); + BinaryNode node= searchTree.init(); + searchTree.rootTree=node; + searchTree.preOrder(searchTree.rootTree); + searchTree.remove(4); + searchTree.preOrder(searchTree.rootTree); + } + +} + + + + + + + + + + + + + diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/BinaryTree.class" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/BinaryTree.class" new file mode 100644 index 0000000000000000000000000000000000000000..5912cd13704ae1d4a991ad5602e57086e901759a Binary files /dev/null and "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/BinaryTree.class" differ diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/BinaryTree.java" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/BinaryTree.java" new file mode 100644 index 0000000000000000000000000000000000000000..d1c1aa0f9293a5264e4ff63b76ed58a5cb69a6be --- /dev/null +++ "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/BinaryTree.java" @@ -0,0 +1,92 @@ +import java.lang.System.Logger.Level; + +import java.util.LinkedList; +import java.util.Queue; + +public class BinaryTree { + public Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错 + /* + * 10 + * 5 15 + * 3 7 12 20 + * preOrder: 10 5 3 7 15 12 20 + */ + Node G = new Node(20, null, null); + Node F = new Node(12, null, null); + Node E = new Node(7, null, null); + Node D = new Node(3, null,null); + Node C = new Node(15, F, G); + Node B = new Node(5, D, E); + Node A = new Node(10, B, C); + return A; //返回根节点 + } + public void printNode(Node node){ + System.out.print(node.getData()); + } + public void theFirstTraversal(Node root) { //先序遍历 + printNode(root); + if (root.getLeftNode() != null) { //使用递归进行遍历左孩子 + theFirstTraversal(root.getLeftNode()); + } + if (root.getRightNode() != null) { //递归遍历右孩子 + theFirstTraversal(root.getRightNode()); + } + } + public void theInOrderTraversal(Node root) { //中序遍历 + if (root.getLeftNode() != null) { + theInOrderTraversal(root.getLeftNode()); + } + printNode(root); + if (root.getRightNode() != null) { + theInOrderTraversal(root.getRightNode()); + } + } + + + public void thePostOrderTraversal(Node root) { //后序遍历 + if (root.getLeftNode() != null) { + thePostOrderTraversal(root.getLeftNode()); + } + if(root.getRightNode() != null) { + thePostOrderTraversal(root.getRightNode()); + } + printNode(root); + } + public void lever(Node node){ + Queue queue = new LinkedList<>(); + Node a; + if(node!=null){ + //入队 + queue.add(node); + while(!queue.isEmpty()){ + a=queue.remove(); + System.out.print(a.getData()); + if(a.getLeftNode()!=null){ + queue.add(a.getLeftNode()); + } + if(a.getRightNode()!=null){ + queue.add(a.getRightNode()); + } + } + } + } + + public static void main(String[] args) { + + BinaryTree tree = new BinaryTree(); + Node root = tree.init(); + System.out.println("先序遍历"); + tree.theFirstTraversal(root); + System.out.println(""); + System.out.println("中序遍历"); + tree.theInOrderTraversal(root); + System.out.println(""); + System.out.println("后序遍历"); + tree.thePostOrderTraversal(root); + System.out.println(""); + System.out.println("层次遍历"); + tree.lever(root); + System.out.println(""); + } +} + diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/Node.class" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/Node.class" new file mode 100644 index 0000000000000000000000000000000000000000..c15be810338822422b3bdcd7565073d3b5a194c4 Binary files /dev/null and "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/Node.class" differ diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/Node.java" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/Node.java" new file mode 100644 index 0000000000000000000000000000000000000000..b8df8f6c93b1252d9a65b31e8831dca8c92e2ba2 --- /dev/null +++ "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\344\272\214\345\217\211\346\240\221\347\232\204\351\201\215\345\216\206/Node.java" @@ -0,0 +1,29 @@ +public class Node { + private int data; + private Node leftNode; + private Node rightNode; + public Node(int data, Node leftNode, Node rightNode){ + this.data = data; + this.leftNode = leftNode; + this.rightNode = rightNode; + } + + public int getData() { + return data; + } + public void setData(int data) { + this.data = data; + } + public Node getLeftNode() { + return leftNode; + } + public void setLeftNode(Node leftNode) { + this.leftNode = leftNode; + } + public Node getRightNode() { + return rightNode; + } + public void setRightNode(Node rightNode) { + this.rightNode = rightNode; + } +} \ No newline at end of file diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/BinaryTreeNode.class" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/BinaryTreeNode.class" new file mode 100644 index 0000000000000000000000000000000000000000..b030abad21283f329ae51dea9e7aaa7c38671b35 Binary files /dev/null and "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/BinaryTreeNode.class" differ diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/GetNextTreeNode.class" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/GetNextTreeNode.class" new file mode 100644 index 0000000000000000000000000000000000000000..b9a03484d89b8b4747b9a243c7f5569f843fcfd0 Binary files /dev/null and "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/GetNextTreeNode.class" differ diff --git "a/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/GetNextTreeNode.java" "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/GetNextTreeNode.java" new file mode 100644 index 0000000000000000000000000000000000000000..f61717030891878216a5119fea3c3c20ecba4e9e --- /dev/null +++ "b/\344\272\214\345\217\211\346\240\221\344\275\234\344\270\232/\350\277\233\351\230\266/GetNextTreeNode.java" @@ -0,0 +1,55 @@ + +class BinaryTreeNode { + public int value; + public BinaryTreeNode leftNode;; + public BinaryTreeNode rightNode; + public BinaryTreeNode parentNode; + + public BinaryTreeNode() { + + } + + public BinaryTreeNode(int value) { + this.value = value; + this.leftNode = null; + this.rightNode = null; + this.parentNode = null; + } + +} +public class GetNextTreeNode { + + public BinaryTreeNode getNext(BinaryTreeNode pNode) { + BinaryTreeNode currentNode = null; + + //情况一:判断是否有右孩子,如果有右孩子 + if(pNode.rightNode != null) { + currentNode = pNode.rightNode; + while(currentNode.leftNode != null) { + currentNode = currentNode.leftNode; + } + + return currentNode; + } + + //情况二:如果是其父节点的左孩子,其父节点就是pNode的下一个节点 + else if( pNode.parentNode != null && pNode.parentNode.leftNode == pNode) { + return pNode.parentNode; + } + + //情况三:如果pNode节点没有右子树,却其父亲节点,爷爷节点... + //其下一节点就是使其 父亲节点... 处于左子树的最左孩子 + else { + currentNode = pNode.parentNode; + while(currentNode.parentNode != null) {//爷爷节点 + if(currentNode.parentNode.leftNode == currentNode) {//找出爷爷节点的最左子树 + return currentNode.parentNode; + } + currentNode = pNode.parentNode; + } + } + + return null; + } + +} \ No newline at end of file