forked from doubleview/data-structure
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTree.java
More file actions
155 lines (129 loc) · 3 KB
/
Tree.java
File metadata and controls
155 lines (129 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package tree;
/**
* 树类,泛型T指定结点的元素类型
*
*/
public class Tree<T> implements TTree<T> {
public TreeNode<T> root;// 根节点,节点结构是树的孩子兄弟链表
@Override
public boolean isEmpty() {
return this.root == null;
}
@Override
public TreeNode<T> getChild(TreeNode<T> p, int i) {
// TODO 自动生成的方法存根
return null;
}
// 返回p节点的最后一个孩子
public TreeNode<T> getLastChild(TreeNode<T> p) {
if (p == null || p.child == null)// p没有孩子
return null;
p = p.child;
while (p.sibling != null)
// p沿着兄弟链到达最后一个兄弟节点
p = p.sibling;
return p;
}
// 返回p节点的最后一个兄弟
public TreeNode<T> getLastSibling(TreeNode<T> p) {
if (p == null || p.sibling == null)
return null;
while (p.sibling != null)
// p沿着兄弟链到达最后一个兄弟节点
p = p.sibling;
return p;
}
@Override
public TreeNode<T> getParent(TreeNode<T> node) {
// TODO 自动生成的方法存根
return null;
}
@Override
// 返回树的结点个数
public int count() {
return count(root);
}
// 返回以结点p为跟的子树的节点个数
public int count(TreeNode<T> p) {
if (p == null)
return 0;
return 1 + count(p.child) + count(p.sibling);
}
@Override
public int childCount(T p) {
// TODO 自动生成的方法存根
return 0;
}
@Override
public int height() {
// TODO 自动生成的方法存根
return 0;
}
@Override
public TreeNode<T> search(T x) {
// TODO 自动生成的方法存根
return null;
}
@Override
public void preOrder() {
// TODO 自动生成的方法存根
}
@Override
public void postOrder() {
// TODO 自动生成的方法存根
}
@Override
public void levelOrder() {
// TODO 自动生成的方法存根
}
// 插入根节点
public void insertRoot(T x) {
this.root = new TreeNode<T>(x, this.root, null);
}
// 插入兄弟节点
public TreeNode<T> insertLastSibling(TreeNode<T> p, T x) {
if (p == null)
return null;
while (p.sibling != null)
// p沿着兄弟链到达最后一个节点
p = p.sibling;
p.sibling = new TreeNode<T>(x);// 插入最后一个节点
return p.sibling;
}
// 插入孩子节点
public TreeNode<T> insertLastChild(TreeNode<T> p, T x) {
if (p == null)
return null;
if (p.child == null) {
p.child = new TreeNode<T>(x);
return p.child;
} else
return insertLastSibling(p.child, x);
}
// 先跟次序遍历树并返回树的横向凹入表示字符串
public String toString() {
return toString(root, "");
}
// 先跟次序遍历以p为跟的子树,tab参数指定缩进量,返回子树的横向凹入表示串
public String toString(TreeNode<T> p, String tab) {
if (p == null)
return "";
return tab + p.data.toString() + "\n" + toString(p.child, tab + "\t")
+ toString(p.sibling, tab);
}
// 返回树或森林的广义表表示字符串
public String toGenListString() {
return toGenListString(this.root);
}
// 返回以p节点为跟的子树的广义表表示
public String toGenListString(TreeNode<T> p) {
if (p == null)
return "";// 返回空子树表示
String str = p.data.toString();
if (p.child != null)
str += "(" + toGenListString(p.child) + ")";
if (p.sibling != null)
str += "," + toGenListString(p.sibling);
return str;
}
}