树的静态写法
用数组下标代替所谓的地址
struct node{
typename data; //数据域
int child[maxn]; //指针域,存放所有子结点的下标
}Node[maxn]; //结点数组,maxn为结点上限个数
当无法预知子结点个数时,可以使用vetctor
struct node{
typename data; //数据域
vector child[maxn]; //指针域,存放所有子结点的下标
}Node[maxn]; //结点数组,maxn为结点上限个数
需要新建一个结点,就按顺序从数组中取出一个下标即可:
int index = 0;
int newNode(int v)
{
Node[index].data = v; //数据域为v
Node[index].child.clear(); //清空子结点
return index++; //返回结点下标,并令index自增
}
树的先根遍历
先访问根结点,再访问所有子树
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的所有子结点
}
}
树的层序遍历
从树根开始,一层一层向下遍历
void LayerOrder(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 layer;
int data;
vector<int> child;
};
树的层次遍历
void LayerOrder(int root)
{
queue<int> Q;
Q.push(root); //将根结点入队
Node[root].layer = 0; //记根结点的层号为0
while(!Q.empty())
{
int front = Q.front(); //取出队首元素
printf("%d ", Node[front].data); //访问当前结点的数据域
Q.pop(); //队首元素
for(int i = 0; i < Node[front].child.size(); i++)
{
int child = Node[front].child[i]; //当前结点的第i个子结点的编号
//子结点层号为当前结点层号加1
Node[child].layer = Node[front].layer+1;
Q.push(child); //将当前结点的所有子结点入队
}
}
}