学习安排根据《代码随想录》leetcode226
因为是一道简单题,就没必要展示完整代码了,今天就是想总结一下自己在这道简单题后面挖掘的一些东西,仅为个人的一种记录习惯~如果有和我一样基础薄弱的新手能够看到且对你们有帮助的话就更好了~
首先,leetcode 给的函数外壳 是直接返回一个 指针类型,如下:
即:通过根节点找到 翻转后的二叉树
因为涉及到 二叉树题目,返回值 除了 vector<>,嵌套 vector<>之外还没写到过这种返回类型,因此,用什么方式可以将 反转后的二叉树存储并输出呢?
接着,我先写了一遍BFS,将 前序遍历 中两个if 代码换了位置,并用数组接受每一次队首元素。企图返回一个数组 得到最终结果(因为看到结果是 [?,?,?,?,?] 这种表示的),显然是异想天开,只是试试罢了。
思索一阵,无果后,看了一下《代录》的答案提示,并copy了一下结果,答案毫无意外的通过了。
就当我总结这些代码, 是如何通过根节点找到二叉树 的时候,陷入了疑惑。于是我在VS上将 二叉树 每一次遍历的值做一次输出,看最终的输出结果如何:
1. 通过DFS,无论如何也得不到答案一样的输出结果,尽管二叉树确实翻转了;
2. 通过BFS,可以输出相同顺序的结果,但是如果 删除某一个核心步骤,二叉树不会翻转;
为了辅助理解,我会用图示表示:
首先,利用DFS翻转二叉树:
结果:
leetcode:两次输出皆正确
VS上输出:两次结果不一样,但都不是leetcode 的结果
其次,利用BFS翻转二叉树
结果:
leetcode上前两个结果正确,后一个不会翻转
VS上:
由上可以得到以下结论:
1.从题目本身来说,给定一个二叉树,拟得到翻转后的二叉树,就需要在二叉树本身做出改变,即调换该二叉树的左右孩子即可,其核心指令为swap(leftchild,rightchild);
2.DFS 中双 if 语句对交换结点没有任何影响,对于二叉树本身来说,不会造成翻转异常,该语句只是用来做遍历用,以便于将所有的结点都做翻转,且影响输出结果。
3.BFS 同理,双 if 语句用作遍历,对交换结点没有影响,但是 双 if 语句存在 一种顺序,能够使得 输出的结果和 题目的结果相同,其原因跟层序遍历的特性有关。
4.如果BFS 缺少 核心指令swap,虽然输出结果相同,但是二叉树本身并没有发生翻转。
因此,改题 如果 想要输出结果与翻转二叉树后的 结果相同,层序遍历是最优的方法~
ps:【给自己的提醒~~】
DFS 用 stack!!!!循环终止条件是stack是否为空,因为它要一直遍历到叶子结点才回头!!
BFS用queue!!!!循环终止条件是queue是否为空,但还有内层循环遍历,需要所有层的元素!需要有一个 变量作为接受 新q的容量!!以便更新!