专题二:二叉树的深度优先搜索
以leetcode2331题为例
题目分析:
以第一个示例为例
算法原理分析:
从宏观角度,也就是我的算法之回溯的第一篇
我们发现我们在研究示例的时候,必须从下往上推
也就是我在研究一个结点是true还是false的时候,必须直到左孩子和右孩子是true还是false
包括我们研究整棵树也要直到左子树和右子树,小问题也是如此
所以我们可以这样定义我们的函数头 bool dfs(TreeNode*rooot);
dfs的作用,给一个结点指针就返回这个结点是true还是false
你要相信这个dfs能够完成任务,并不关心它是如何完成的
函数头: bool dfs(TreeNode*rooot);
函数体:bool left=dfs(root->left);//返回此时你这个结点左孩子的bool值
bool right=dfs(root->right)//返回此时你这个结点右孩子的bool值
递归出口:
想一想什么时候是出口???(什么时候子问题不能在分成子问题)
当然是叶子结点的时候,你是叶子的时候就没必要直到左孩子和右孩子的值了吧
第二个角度看待:细节看待dfs
这个你就想一下知道左/右才能知道根
所以就是后序遍历