Skip to content

Commit cd13103

Browse files
committed
[Function add]
1.Add in order traversal of binary tree.
1 parent ef2bb6a commit cd13103

File tree

3 files changed

+107
-12
lines changed

3 files changed

+107
-12
lines changed

Algorithm(4th_Edition)/algorithm_note.txt

+46-2
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@
945945
if(node == null) return null;
946946
return node.k;
947947
}
948-
public Node floor(Node node, K k){
948+
public Node floor(Node node, K k){ //对于树的遍历,我们可以考虑递归调用,只需要考虑当前情况针对父结点和两个子结点
949949
if(null == node) return null;
950950
int cmp = k.compareTo(node.k);
951951
if(cmp == 0) return node; //如果当前所需要的键值和父节点的键值一样,说明当前的结点就是小于当前结点的最大结点。
@@ -972,6 +972,30 @@
972972
else if(cmp > 0) return 1 + size(node.left) + rank(node.right, k);
973973
else return size(node.left);
974974
}
975+
public void delMin(){ root = delMin(root); }
976+
public Node delMin(Node node){ //删除以当前结点为父节点中最小的结点。
977+
if(node.left == null) return node.right; //当前结点的左子结点为空,说明当前节点就是在三个结点中最小的。将右结点返回最为新的结点。
978+
node.left = delMin(node.left); //左子结点不为空,递归调用
979+
node.N = size(node.left) + size(node.right) + 1; //更新当前节点的size
980+
return node; //返回值是更新后的新的父结点。
981+
}
982+
public void delete(K k){ root = delete(root,k); }
983+
public Node delete(Node node, K k){
984+
if(node == null) return null;
985+
int cmp = k.compareTo(node.k);
986+
if(cmp > 0) node.right = delete(node.right, k);
987+
else if(cmp < 0) node.left = delete(node.left, k);
988+
else{
989+
if(node.right == null) return node.left; //如果当前结点只有一个子结点,则用当前的子结点顶替原来子结点的位置。
990+
if(node.left == null) return node.right;
991+
Node temp = node; //如果有两个子结点,可以替换当前结点的新结点在右子结点及其子结点中。
992+
node = min(node.right); //找到可以替换当前结点的新的结点
993+
node.left = temp.left; //将原来的子左结点替换
994+
node.right = delMin(temp.right); //将最小值删除并且并将父结点绑定
995+
}
996+
node.N = size(node.left) + size(node.right) + 1;
997+
return node;
998+
}
975999
}
9761000
Node是树上的某个结点,一个结点有如下的特征:
9771001
->K,键:用于确定该结点在树中的位置。
@@ -1007,7 +1031,27 @@
10071031
如果二叉树是平衡的,即每个结点都有左子结点和右子结点,这个二叉树是平衡二叉树,算法的复杂度为lgN.
10081032
**二叉树越不平衡,算法复杂度越高。
10091033

1010-
1034+
5. 范围查找:
1035+
将二叉树中的所有的键按照顺序打印出来。
1036+
->中序遍历:
1037+
1.我们应该先打印出根结点的左子树中的所有键。
1038+
2.打印根结点的键。
1039+
3.打印出右结点的键。
1040+
实现:ca.mcmaster.chapter.three.bitree.BinaryTreeSymbolTable#keys()
1041+
public Iterable<K> keys(){ return keys(min(), max()); }
1042+
public Iterable<K> keys(K lo, K hi){ //返回键在下限和上限之间的键所组成的队列。(包括边界)
1043+
ListFIFOQueue<K> queue = new ListFIFOQueue<>(); //创建一个先入先出的队列
1044+
keys(root, queue, lo, hi);
1045+
return queue;
1046+
}
1047+
public void keys(Node node, ListFIFOQueue<K> queue, K lo, K hi){
1048+
if(null == node) return;
1049+
int cmplo = lo.compareTo(node.k);
1050+
int cmphi = hi.compareTo(node.k);
1051+
if(cmplo < 0) keys(node.left, queue, lo, hi); //从当前结点开始向左遍历,直到接触到lo对应的结点,加入队列。[lo-current]
1052+
if(cmplo <= 0 && cmphi >= 0) queue.enqueue(node.k);
1053+
if(cmphi > 0) keys(node.right, queue, lo, hi); //从当前结点开始向右遍历,直到接触到hi对应的结点,将所有之间的结点加入队列。[current-hi]
1054+
}
10111055

10121056

10131057

Algorithm(4th_Edition)/src/ca/mcmaster/chapter/three/bitree/BinaryTreeSymbolTable.java

+32-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package ca.mcmaster.chapter.three.bitree;
22

3+
import java.util.Iterator;
4+
5+
import ca.mcmaster.chapter.one.FIFO.ListFIFOQueue;
6+
37
public class BinaryTreeSymbolTable<K extends Comparable<K>, V> extends
48
BinaryTreeSymbolTableAbstract<K, V> {
59
public V get(K k) { return get(root, k); }
@@ -23,18 +27,36 @@ public Node put(Node node, K k, V v){
2327
return node;
2428
}
2529

30+
public Iterable<K> keys(){ return keys(min(), max()); }
31+
public Iterable<K> keys(K lo, K hi){
32+
ListFIFOQueue<K> queue = new ListFIFOQueue<>();
33+
keys(root, queue, lo, hi);
34+
return queue;
35+
}
36+
public void keys(Node node, ListFIFOQueue<K> queue, K lo, K hi){
37+
if(null == node) return;
38+
int cmplo = lo.compareTo(node.k);
39+
int cmphi = hi.compareTo(node.k);
40+
if(cmplo < 0) keys(node.left, queue, lo, hi);
41+
if(cmplo <= 0 && cmphi >= 0) queue.enqueue(node.k);
42+
if(cmphi > 0) keys(node.right, queue, lo, hi);
43+
}
44+
2645
public static void main(String[] args) {
27-
BinaryTreeSymbolTableAbstract<Integer, String> table = new BinaryTreeSymbolTable<>();
28-
table.put(1, "a");
29-
table.put(2, "b");
30-
table.put(3, "c");
31-
table.put(8, "d");
46+
BinaryTreeSymbolTable<Integer, String> table = new BinaryTreeSymbolTable<>();
47+
table.put(4, "a");
48+
table.put(3, "b");
49+
table.put(7, "c");
50+
table.put(2, "d");
3251
table.put(5, "e");
3352
table.put(6, "f");
34-
table.put(7, "g");
35-
// for (int i = 0; i < 7; i++) {
36-
// System.out.println(table.get(8));
37-
// }
38-
System.out.println(table.select(1));
53+
table.put(1, "g");
54+
table.delete(5);
55+
Iterable<Integer> keys = table.keys();
56+
Iterator<Integer> it = keys.iterator();
57+
while(it.hasNext()){
58+
System.out.println(table.get(it.next()));
59+
}
60+
// System.out.println(table.select(0));
3961
}
4062
}

Algorithm(4th_Edition)/src/ca/mcmaster/chapter/three/bitree/BinaryTreeSymbolTableAbstract.java

+29
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ public Node min(Node node){
2323
if(node.left == null) return node;
2424
return min(node.left);
2525
}
26+
public K max(){ return max(root).k; }
27+
public Node max(Node node){
28+
if(node.right == null) return node;
29+
return max(node.right);
30+
}
2631
public K floor(K k){ //返回小于等于当前键值的最大值
2732
Node node = floor(root, k);
2833
if(node == null) return null;
@@ -55,4 +60,28 @@ public Integer rank(Node node, K k){
5560
else if(cmp > 0) return 1 + size(node.left) + rank(node.right, k);
5661
else return size(node.left) + 1;
5762
}
63+
public void delMin(){ root = delMin(root); }
64+
public Node delMin(Node node){
65+
if(node.left == null) return node.right; //当前节点就是最小的
66+
node.left = delMin(node.left);
67+
node.N = size(node.left) + size(node.right) + 1;
68+
return node;
69+
}
70+
public void delete(K k){ root = delete(root,k); }
71+
public Node delete(Node node, K k){
72+
if(node == null) return null;
73+
int cmp = k.compareTo(node.k);
74+
if(cmp > 0) node.right = delete(node.right, k);
75+
else if(cmp < 0) node.left = delete(node.left, k);
76+
else{
77+
if(node.right == null) return node.left;
78+
if(node.left == null) return node.right;
79+
Node temp = node;
80+
node = min(node.right);
81+
node.left = temp.left;
82+
node.right = delMin(temp.right);
83+
}
84+
node.N = size(node.left) + size(node.right) + 1;
85+
return node;
86+
}
5887
}

0 commit comments

Comments
 (0)