Skip to content

Commit 5d6dcd4

Browse files
committed
增加了二叉树的增删改
1 parent 2612b92 commit 5d6dcd4

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/**
2+
* 二叉树的增删查操作
3+
*/
4+
export class TreeSearch {
5+
private root?: Node
6+
7+
public find(data: number) {
8+
let p = this.root
9+
while (p != null) {
10+
if (data < p.data) {
11+
p = p.left
12+
} else if (data > p.data) {
13+
p = p.right
14+
} else {
15+
return p
16+
}
17+
}
18+
return p
19+
}
20+
21+
public insert(data: number) {
22+
if (this.root == null) {
23+
this.root = new Node(data)
24+
return
25+
}
26+
let p = this.root
27+
while (p != null) {
28+
if (data < p.data) {
29+
if (p.left == null) {
30+
p.left = new Node(data)
31+
return
32+
} else {
33+
p = p.left
34+
}
35+
} else {
36+
if (data > p.data) {
37+
if (p.right == null) {
38+
p.right = new Node(data)
39+
return
40+
} else {
41+
p = p.right
42+
}
43+
}
44+
}
45+
}
46+
}
47+
48+
/**
49+
* 删除的时候分三种情况
50+
* @param data
51+
*/
52+
public delete(data: number) {
53+
// 先把对应的元素找出来,并且为了删除,也得记录父节点的内存地址
54+
// 包含了null或者undefined两种情况
55+
if (this.root == null) return
56+
let p: Node | undefined = this.root
57+
let pp = this.root
58+
while (p != null && p.data !== data) {
59+
pp = p
60+
data > p.data ? p = p.right : p = p.left
61+
}
62+
// 没有找到要删除的元素
63+
if (p == null) return
64+
// 要删除的元素有两个子节点,需要找到右子树的最小节点,然后赋值
65+
if (p.left != null && p.right != null) {
66+
// 右子树的最小节点
67+
let minP = p.right
68+
// 右子树的最小节点的父节点
69+
let minPP = p
70+
while (minP.left != null) {
71+
minPP = minP
72+
minP = minP.left
73+
}
74+
p.data = minP.data
75+
p = minP
76+
pp = minPP
77+
}
78+
79+
// 有一个子节点或者没有子节点
80+
let child
81+
if (p.left != null) {
82+
child = p.left
83+
} else if (p.right != null) {
84+
child = p.right
85+
} else {
86+
child = null
87+
}
88+
if (pp == null) {
89+
this.root = undefined
90+
} else if (pp.left === p) {
91+
pp.left = child!
92+
} else {
93+
pp.right = child!
94+
}
95+
}
96+
97+
public printAllData(): void {
98+
this.printAll(this.root)
99+
}
100+
101+
private printAll(node?: Node): void {
102+
if (node == null) return
103+
console.log(node.data)
104+
this.printAll(node.left)
105+
this.printAll(node.right)
106+
}
107+
}
108+
109+
export class Node {
110+
data: number
111+
left?: Node
112+
right?: Node
113+
114+
constructor(data: number) {
115+
this.data = data
116+
}
117+
}
118+
119+
const treeSearch = new TreeSearch()
120+
treeSearch.insert(1)
121+
treeSearch.insert(4)
122+
treeSearch.insert(3)
123+
treeSearch.insert(2)
124+
treeSearch.insert(5)
125+
treeSearch.insert(0)
126+
127+
treeSearch.delete(4)
128+
129+
treeSearch.printAllData()

0 commit comments

Comments
 (0)