diff --git a/shujujiegou/Tree.iml b/shujujiegou/Tree.iml
new file mode 100644
index 0000000..9465dd8
--- /dev/null
+++ b/shujujiegou/Tree.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/shujujiegou/src/com/lmk/arraybinarytree/ArrayBinaryTree.java b/shujujiegou/src/com/lmk/arraybinarytree/ArrayBinaryTree.java
new file mode 100644
index 0000000..a7d2909
--- /dev/null
+++ b/shujujiegou/src/com/lmk/arraybinarytree/ArrayBinaryTree.java
@@ -0,0 +1,82 @@
+package com.lmk.arraybinarytree;
+
+public class ArrayBinaryTree {
+ private int[] root;
+
+ public ArrayBinaryTree() {
+ }
+
+ public ArrayBinaryTree(int[] root) {
+ this.root = root;
+ }
+
+ public int[] getRoot() {
+ return root;
+ }
+
+ public void setRoot(int[] root) {
+ this.root = root;
+ }
+
+ public void before(){
+ before(0);
+ }
+
+ /**
+ * 先序遍历
+ * @param index
+ */
+ public void before(int index) {
+ if(index>this.root.length-1){
+ return;
+ }
+ System.out.println(this.root[index]);
+
+ if(2*index+1 this.root.length-1){
+ return;
+ }
+ if(2*index +1this.root.length-1){
+ return;
+ }
+ if(2*index+1arr[max]){
+ max = left;
+ }
+
+ //如果右节点数大于最大值,最大值为右节点
+ if(rightarr[max]){
+ max = right;
+ }
+ //最大值不等于当前节点,交换位置
+ if(max!=currentparents){
+ int temp = arr[max];
+ arr[max] = arr [currentparents];
+ arr[currentparents] = temp;
+ //继续排序
+ maxHead(arr,size,max);
+ }
+ }
+
+ }
+
+
+ /**
+ *
+ * @param arr 数组
+ * @param size 排序的长度
+ */
+ public void sortHead(int[] arr,int size){
+
+
+ for(int i =size-1;i>=0;i--){
+ //父节点位置
+ int start = (i-1)/2;
+ maxHead(arr,size,start);
+ }
+ }
+
+ /**
+ *
+ * @param arr 待排序数组
+ */
+ public void sortSwapHead(int[] arr){
+
+ for(int i = 0;i=0;i--){
+// h.heapSort(sortarrray,i);
+// System.out.println(Arrays.toString(sortarrray));
+// }
+
+ for (int i = 0; i < sortarrray.length; i++) {
+
+ //每次建堆就可以排除一个元素了
+ h.heapSort(sortarrray, sortarrray.length - i);
+
+ //交换
+ int temp = sortarrray[0];
+ sortarrray[0] = sortarrray[(sortarrray.length - 1) - i];
+ sortarrray[(sortarrray.length - 1) - i] = temp;
+
+ }
+ System.out.println(Arrays.toString(sortarrray));
+
+
+ }
+
+
+ public void heapSort(int arr[],int size){
+// int start = (arr.length-1)/2;
+// for(int i = start;i>0;i--){
+// maxHeap(arr,i,arr.length);
+// }
+// int temp =arr[0];
+// arr[0]=arr[size];
+
+ for (int i = size - 1; i >= 0; i--) {
+ maxHeap(arr, (i-1)/2, size);
+ }
+
+ }
+ int[] waitSortArray = new int[]{7,2,4,5,6,2};
+ /**
+ * 7
+ * 2 6
+ * 3 0 2 5
+ * 8 9
+ */
+
+ /**
+ *
+ * @param arr 数组
+ * @param currentRootIndex 当前节点父节点的位置
+ * @param size 节点总数
+ */
+ public void maxHeap(int arr[],int currentRootIndex,int size){
+
+ if(currentRootIndex list =new ArrayList<>();
+
+ for(int value:arr){
+ list.add(new Node(value));
+ }
+ //当集合中只有一个树时,他就是最优二叉树
+ while(list.size()>1){
+ System.out.println(list.size());
+ //排序
+ list.sort(Node::compareTo);
+ //去除最小的两个节点 最小的为左节点
+ Node left = list.get(0);
+ Node right = list.get(1);
+ //创建一个新的二叉树
+ Node newNode = new Node(left.getValue()+right.getValue());
+ newNode.setLeftNode(left);
+ newNode.setRightNode(right);
+ //移除两个最小的节点
+ list.remove(0);
+ list.remove(0);
+ //将新树添加到集合中
+ list.add(newNode);
+ }
+ return list.get(0);
+ }
+
+ public static void before(Node node){
+ node.before(node);
+ }
+}
diff --git a/shujujiegou/src/com/lmk/humantree/Node.java b/shujujiegou/src/com/lmk/humantree/Node.java
new file mode 100644
index 0000000..d08098e
--- /dev/null
+++ b/shujujiegou/src/com/lmk/humantree/Node.java
@@ -0,0 +1,68 @@
+package com.lmk.humantree;
+
+public class Node implements Comparable {
+
+ //值
+ private int value;
+
+ //左节点
+ private Node leftNode;
+
+ //右节点
+ private Node rightNode;
+
+ public Node(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+
+ public Node getLeftNode() {
+ return leftNode;
+ }
+
+ public void setLeftNode(Node leftNode) {
+ this.leftNode = leftNode;
+ }
+
+ @Override
+ public String toString() {
+ return "Node{" +
+ "value=" + value +
+ '}';
+ }
+
+ public Node getRightNode() {
+ return rightNode;
+ }
+
+ public void setRightNode(Node rightNode) {
+ this.rightNode = rightNode;
+ }
+
+ @Override
+ public int compareTo(Object o) {
+ return this.value - ((Node)o).value;
+ }
+
+ public void before(Node node) {
+ if(node!=null){
+ System.out.println(node.getValue());
+
+ if(node.leftNode!=null){
+ before(node.leftNode);
+ }
+
+ if(node.rightNode!=null){
+ before(node.rightNode);
+ }
+ }
+
+ }
+}
diff --git a/shujujiegou/src/com/lmk/threadbinarytree/TestThreadBinaryTree.java b/shujujiegou/src/com/lmk/threadbinarytree/TestThreadBinaryTree.java
new file mode 100644
index 0000000..12f7009
--- /dev/null
+++ b/shujujiegou/src/com/lmk/threadbinarytree/TestThreadBinaryTree.java
@@ -0,0 +1,26 @@
+package com.lmk.threadbinarytree;
+
+public class TestThreadBinaryTree {
+ public static void main(String[] args) {
+ ThreadBinaryTree threadBinaryTree =new ThreadBinaryTree();
+
+ TreeNode node1 = new TreeNode(1);
+ TreeNode node2 = new TreeNode(2);
+ TreeNode node3 = new TreeNode(3);
+ TreeNode node4 = new TreeNode(4);
+ TreeNode node5 = new TreeNode(5);
+ TreeNode node6 = new TreeNode(6);
+ TreeNode node7 = new TreeNode(7);
+
+ threadBinaryTree.root = node1;
+ node1.leftNode=node2;
+ node1.rightNode = node3;
+ node2.leftNode = node4;
+ node2.rightNode = node5;
+ node3.leftNode =node6;
+ node3.rightNode = node7;
+ threadBinaryTree.threadBinaryTree();
+ System.out.println(node4.rightNode.value);
+ System.out.println(node5.leftNode.value);
+ }
+}
diff --git a/shujujiegou/src/com/lmk/threadbinarytree/ThreadBinaryTree.java b/shujujiegou/src/com/lmk/threadbinarytree/ThreadBinaryTree.java
new file mode 100644
index 0000000..65215be
--- /dev/null
+++ b/shujujiegou/src/com/lmk/threadbinarytree/ThreadBinaryTree.java
@@ -0,0 +1,52 @@
+package com.lmk.threadbinarytree;
+
+
+
+/**
+ * 线索二叉树
+ *
+ */
+public class ThreadBinaryTree {
+
+ TreeNode root;
+ //存储前一个结点
+ TreeNode preNode;
+
+ public void threadBinaryTree(){
+ if(root!=null){
+ threadBinaryTree(root);
+ }
+
+ }
+ //中序线索二叉树
+ public void threadBinaryTree( TreeNode node){
+ //左节点
+ if(node.leftNode!=null){
+ threadBinaryTree(node.leftNode);
+ }
+
+ //根
+ //左节点为空,指向前一个节点,flag变为1
+ if(node.leftNode==null){
+ node.leftNode = preNode;
+ node.leftFlag=1;
+ }
+ //如果前一个节点为空,使其指向本节点(即右节点指向后一个节点)
+ if(preNode!=null&&preNode.rightNode==null){
+ preNode.rightNode=node;
+ preNode.rightFlag=1;
+ }
+
+ preNode = node;
+ //右节点
+ if(node.rightNode!=null){
+ threadBinaryTree(node.rightNode);
+ }
+ }
+
+
+
+
+
+
+}
diff --git a/shujujiegou/src/com/lmk/threadbinarytree/TreeNode.java b/shujujiegou/src/com/lmk/threadbinarytree/TreeNode.java
new file mode 100644
index 0000000..de4822f
--- /dev/null
+++ b/shujujiegou/src/com/lmk/threadbinarytree/TreeNode.java
@@ -0,0 +1,13 @@
+package com.lmk.threadbinarytree;
+
+public class TreeNode {
+
+ public TreeNode(int value){
+ this.value = value;
+ }
+ int value;
+ TreeNode leftNode;
+ int leftFlag;
+ TreeNode rightNode;
+ int rightFlag;
+}