by h94usu/6
"樹"的基本介紹
環
連通
樹
v
v
x
x
v
v
x
v
v
x
x
x
a
b
c
d
e
f
g
根節點 root
節點 node
葉節點 leaf node
邊 edge
a
b
c
d
e
f
g
d, c 為b 的子節點 child
b, c 為兄弟節點 siblings
a 為 b, c 的父節點 parent
a, b 為d 的祖先 ancestor
d, e, g 為b 的子代 descendant
☐ 為b 的子樹 subtree
分4 層level, 深度depth 為4
level 0
level 1
level 2
level 3
a
b
c
d
e
b
d
a
e
c
5 個節點
4 條邊
建立一棵"樹"
#inlcude <iostream>
using namespace std;
struct Node{
int _data; //不一定是int
Node *_child1, *_child2, *_child3... ;
};
△注意: 不確定有幾個子節點,開太大會造成記憶體的浪費
#inlcude <iostream>
#include <vector>
using namespace std;
struct Node{
int _data; //不一定是int
vector<Node*> _child;
};
#inlcude <iostream>
#include <vector>
using namespace std;
int data[size];
vector<int> child[size];
//size 即為節點個數
二元樹
#inlcude <iostream>
using namespace std;
struct Node{
int _data;
Node *left_child, *right_child;
};
△注意: 定義根節點所在深度為第0 層
a
b
c
d
e
f
a
b
c
d
e
f
a
b
c
d
e
f
d
full binary tree
complete binary tree
a
b
c
d
e
f
d
full binary tree
a
b
c
d
e
f
complete binary tree
"樹"的遍歷
void pre_order_traversal(Node *root) {
cout << root->data << " ";
if (root->left_child != NULL) //如有子代則讀取其子樹
pre_order_traversal(root->left_child);
if (root->right_child != NULL) //另一側
pre_order_traversal(root->right_child);
}
a
b
c
d
e
output: a b d e c
根
△根在最前
void in_order_traversal(Node *root) {
if (root->left_child != NULL) //如有子代則讀取其子樹
in_order_traversal(root->left_child);
cout << root->data << " ";
if (root->right_child != NULL) //另一側
in_order_traversal(root->right_child);
}
a
b
c
d
e
output: d b e a c
根
△根在中間
void post_order_traversal(Node *root) {
if (root->left_child != NULL) //如有子代則讀取其子樹
post_order_traversal(root->left_child);
if (root->right_child != NULL) //另一側
post_order_traversal(root->right_child);
cout << root->data << " ";
}
a
b
c
d
e
output: d e b c a
根
△根在最後
void level_order_traversal(node *root) {
int head = 0, tail = 0;
node *p[SIZE] = {NULL};
node *tmp;
if (root != NULL) {
p[head] = root;
tail++;
cout << p[head]->data << " ";
}
else return;
while (head < tail) {
tmp = p[head];
cout << root->data << " ";
if (tmp->left_child != NULL) { //如有子代則讀取其子樹
p[tail] = tmp->left_child;
tail++;
}
if (tmp->right_child != NULL) { //另一側
p[tail] = tmp->right_child;
tail++;
}
head++;
}
return;
}
a
b
c
d
e
output: a b c d e
根
△根在最前