9.3.1 树的静态写法:
struct node
{
typename data; //数据域
int child[maxn]; //指针域,存放所有子节点的下标
}Node[maxn];
struct node
{
typename 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++
}
9.3.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]); //递归访问结点root的所有子节点
}
9.3.3 树的层序遍历:
void LayerRoot(int Root)
{
queue<int> Q;
Q.push(Root); //将根结点入队
while(!Q.empty())
{
int front=Q.front(); //取出队首元素
printf("%d",Node[front].data); //访问当前结点的数据域
Q.pop(); //队列中弹出这个首元素
for(int i=0; i<Node[front].child.size(); i++)
Q.push(Node[front].child[i]); //将当前根结点的所有子节点入队
}
}
struct node
{
int data;
int layer; //记录层号
vector<int> child;
};
//void类型函数 LayerOrder,形参为int类型 root
//int类型队列Q
//记录根结点层号为0
//while循环:取出队首元素-》访问当前结点的数据域-》队首元素出列-》for循环遍历当前结点的所有孩子,并将数字记录在
//child中,child对应的Node类型的数组的层数为当前结点的node类型参数+1
//将所有的子节点入队列
void LayerOrder(int root)
{
queue<int> q;
q.push(root); //将根结点入队
Node[root].layer=0; //记录根结点层号为0
while(!q.empty())
{
int front=q.front();
cout << Node[front].data;
q.pop(); //弹出队首元素
for(int i=0; i<Node[front].child.size(); i++)
{
int child=Node[front].child[i];
Node[child].layer=Node[front].layer+1; //子节点层号为当前结点层号+1
}
q.push(child); //将当前结点的所有子节点入队列
}
}
9.3.4从树的遍历看DFS和BFS
类似于图中走迷宫,只要遇到岔路口就继续深入下去,一直到遍历完所有的岔路口,不碰到死胡同不回头