1.树的静态写法
树的子结点个数不限且子结点没有先后次序,与二叉树不同。
struct node{
int data;//数据域
vector<int> child;//指针域,用来存放所有子结点的下标
}Node[maxn];
新建结点:
int index = 0;
int newNode(int v){
Node[index].data = v;//数据域为v
Node[index].child.clear();//清空子结点
return index++;//返回结点下标,并令index自增
}
2.树的先根遍历
先根遍历:总是访问根结点,再去访问所有子树。
void PreOrder(int root){
printf("%d",Node[root].data);
for(int i = 0;i < Node[root].child.size();i++{
PreOrder(Node[root].child[i]);
}
}
3.树的层序遍历
树的层序遍历与二叉树的层序遍历思路一致,可参考我另一篇博文算法笔记——数据结构(二叉树的遍历)。
一般是使用一个队列来存放结点在数组中的下标,每次取出队首元素来访问,并将所有子结点加入队列,直到队列为空。
void LayerOrder(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int front = q.front();
q.pop();
for(int i = 0;i < q[front].child.size();i++{
q.push(Node[front].child[i]);
}
}
}
加入层号求解的,与二叉树的加法相同,不再累述。