这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
重读「遍历」
你觉得学会了上文的三种遍历真的就可以解决问题了么?
- 其实不然,我们也必须掌握层序遍历
void LevelOrder(BiTree){
InitQueue(Q); //初始化的辅助队列
BiTree p;
EnQueue(Q,T); //根节点入队
while(!Empty(Q)){
DeQueue(Q,p); //队头出队
visit(p); //访问队头
if(p->lchild != NULL){ //左不空则入队
EnQueue(Q,p->lchild);
}if(p->rchild != NULL){ //右不空则入队
EnQueue(Q,p->rchild);
}
}
}
- 层序遍历借用了队列来控制每层都是有序的从左到右遍历和弹栈
-
记住上面的思想,来看下面的题
-
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
-
给定二叉树:
[3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
- 返回
[3,9,20,15,7] - 很明显是使用BFS,但是去思考上面的思想
- 代码的思想就是将每层去遍历,然后存到队列中,在每次出队的时候,去递归遍历其左右子节点
温习
-
重新回到上一篇文章的三种遍历方式,读者是否已经忘了呢
-
我们来做一道题重新回顾!
-
题目: 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
-
示例:给定如下二叉树,以及目标和 target = 22
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
- 返回 [5,4,11,2],[5,8,4,5] 代码如下图
- 首先我们看到题目以后,选择遍历方式,这道题使用先序遍历就可以解决
- 其次要考虑我的辅助函数应该如何去设置
- 是否我们可以当tar为0的时候就可以记录了---出口
- 当遍历走到null的时候是否可以直接去返回---终止
㊗️大家算法题过关斩将!