不同于 二叉树遍历之递归遍历 和 二叉树遍历之迭代遍历
我们还可以采用每一层的遍历顺序来访问树的节点
考虑一个问题:
访问完左子节点如何能够访问右子节点呢,他们是平级关系,兄弟节点
如若要访问,势必要再次利用父节点作为过渡,那么
当这个树特别大时,还要来回的从 最左子节点<>根节点 <> 最右子节点,这是不现实的
如何解决:
方法一、队列方式
111. 二叉树的最小深度 文章的广度优先算法内容
另外一种用方式更加友好,动态分配队列,参考
方法二、数组方式
如果我们对每一个树节点给点一个序号,那么再用计数数组的思想将序号对应到一维数组坐标,无论采用哪种遍历方式,最终生成的一维数组存储的就是整棵树以层序得来的结果
如果根节点序号=1,那么其左子节点=2,右子节点=3,依次排序,我们会发现
如果父节点序号=i,那么其左子节点序号=2*i,其右子节点序号=2*i+1,空节点依旧要标号
实现代码:
void levelorder(struct TreeNode* root, int idx, int *array)
{
if(root == NULL)
return;
array[idx] = root->val;
levelorder(root->left, 2*idx, array);
levelorder(root->right, 2*idx+1, array);
}
levelorder(node1, 1, array);
要特别注意,因为倍数关系,序号的增长是非常快的,数组的空间要预留很大
-------levelorder------
array[1]=1
array[2]=2
array[3]=3
array[4]=4
array[6]=5
array[7]=6
array[15]=7