树的遍历

如果要实现树的结构,按照前面的链表实现指针域需要开一个数组,可能比较麻烦,这里采用静态实现,又考虑到一个结点的孩子树不确定,用vector定义变长数组,最后结构如下:

struct node{
   datatype data;
   vector<int>child;
}Node[maxn];

如果遇到某些问题只需要树的结点不需要数据域,上述结构还可以直接用vector<int>Node[maxn]代替
树有两种遍历,是先根遍历和层序遍历,根据上述结构其实现如下:

void preorder(int root) {  //先根遍历 
	
	printf("%d",Node[root].data);
	for(int i=0;i<Node[root].child.size();i++)
	preorder(Node[root].child[i]);
	
}

void layerorder(int root) { //层序遍历 
	queue<int>q;
	q.push(root);
	int temp;
	while(!q.empty()){
		temp=q.front();q.pop();
		printf("%d",Node[temp].data);
		for(int i=0;i<Node[root].child.size();i++){
			q.push(Node[root].child[i]);
		}
	}	
}

实际上,观察上述程序你会发现它和dfs、bfs十分相像,而遇到bfs,dfs问题可以将其途中的状态转化为树的结点,那问题也就直观的转化成对树的遍历问题。
对于求层次,求每层结点数、求路径这些问题应该熟练掌握。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值