题目:给定一个二叉树,编写程序计算二叉树最大的深度。
二叉树的深度定义:根结点到最远的叶节点的最长路径上的结点数
叶节点:没有左右孩子的结点
根据题目完成下面的函数:
int maxDepth(struct TreeNode* root){
}
到这里大家可以先不要往下看,先思考一下。
在这里可以给大家一点提示,可以采用DFS,BFS来完成。
方案1:深度优先搜索(DFS)
虽然我之前的博客已经讲解过深度优先算法,在这里考虑到有些朋友忘记了这种算法,我就简单讲解一下。
深度优先搜索就是一条路走到底,这条不再通路,就返回上一个路口,看一下有没有岔路,有的话,从这条岔路又一直走到底,发现没路了,再返回上一个路口是否又岔路,一直这样下去,直到所有的岔路口都走遍。为更直观,我还是画一下图给大家。
从路口1开始进入,假设规律是碰到岔路口,先走左边再走右边
第一次走法:1->2>4>8最后发现路口8之后不再有路,返回上一个路口4
第二次走法:从路口4出发,往右走,发现又是死胡同,走回上一个路口2
第三次走法:从路口2出发,往右走,2->5,发路口5之后还是死胡同,走回上一个路口2,发现路口2的左右岔路口都走过了,再往回到路口1
第四次走法:从路口1出发,1->3>6,发现路口6之后是死胡同,往回走到路口3
第五次走法:从路口3出发,3->7,发现路口7之后又是死胡同,往回走到路口3,发现路口3左右岔路口都已经走过了,再往回走到1,发现路口1的左右岔路口都走遍了,而且路口1还是入口,也就说此时所有的路都走遍了,可以直接出去了。
所以总的路线为1->2->4->8->5->3->6->7
这下大家对深度优先搜索有更深的印象了吧。
好了,回到题目的答案上来:
方案2: 广度优先搜索
我还是来给看我博客的朋友们解释一下广度优先搜索(BFS)。
我还是以上面的栗子进行讲解。
规则是遇到岔路口,先将岔路口走完,再走岔路口的岔路口,还是先走岔路口的左边,再到右边
第一步:1->2->3,走完第一个岔路口,接着走到该岔路抠左边的下一个岔路口2
第二步:2->4->5,走完该岔路口,接着走1岔路口的右边下一个岔路口3
第三步:3->6->7,走完该岔路口,接着走岔路口4
第四步:4->8,此时就已经走完了
总路线:1->2->3->4->5->6->7->8
简单来说就是一层一层的遍历
好了,回到答案本身: