对「树的搜索🌲」的感悟-2

168 阅读2分钟

这是我参与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);
		}
	}
}

图片.png

  • 层序遍历借用了队列来控制每层都是有序的从左到右遍历和弹栈

  • 记住上面的思想,来看下面的题

  • 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

  • 给定二叉树: [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7
  • 返回[3,9,20,15,7]
  • 很明显是使用BFS,但是去思考上面的思想

图片.png

  • 代码的思想就是将每层去遍历,然后存到队列中,在每次出队的时候,去递归遍历其左右子节点

温习

  • 重新回到上一篇文章的三种遍历方式,读者是否已经忘了呢

  • 我们来做一道题重新回顾!

  • 题目: 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

  • 示例:给定如下二叉树,以及目标和 target = 22

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1
  • 返回 [5,4,11,2],[5,8,4,5] 代码如下图

图片.png

  • 首先我们看到题目以后,选择遍历方式,这道题使用先序遍历就可以解决
  • 其次要考虑我的辅助函数应该如何去设置
  • 是否我们可以当tar为0的时候就可以记录了---出口
  • 当遍历走到null的时候是否可以直接去返回---终止

㊗️大家算法题过关斩将!