开辟新专题!不擅长的图它来了来了!(莫名激动
进度:10/100
另:没想到给自己挖了个坑,可以用dfs的基本上也可以用bfs,看来要双线并行了。
补:图算法是我近期得有30%的焦虑来源了,但是不管三七二十一,奥力给,干他兄弟们!
两周的提交记录。努力努力再努力!
原题1:
给你二叉树的根节点 root
,返回它节点值的 前序 遍历。
原题2:
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
原题3:
给你一棵二叉树的根节点 root
,返回其节点值的 后序遍历 。
原题4:
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
原题5:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
原题6:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
原题7:
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
原题8:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
原题9:
给定一个二叉树,判断它是否是 平衡二叉树
(平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 1。)
1.二叉树的前序遍历--简单
中左右。
(1.递归。
(2。迭代。当栈不为空或节点不为空时,我们将root->val加入vector,一直入栈root的左节点直至root为空,说明左节点已经遍历完,root指向栈顶的右节点,继续循环。
(3.Morris迭代。还不会
2.二叉树的中序遍历--简单
左中右。
栈的用法:
stk.top(),stk.pop(),stk.push()
思路:
(1.递归。先遍历左节点,再将根节点入vector,再遍历右节点。
(2.迭代。so,迭代与递归到底有什么区别,我一直认为他俩一样。
区别:迭代是通过调用一个迭代器解决问题,譬如用一个for循环来计算1~100的和。递归是通过反复调用自身来解决问题。
我们使用一个栈,在它不为空或者节点不为空时,一直循环将当前指针指向左直至当前为空,然后将栈首出队(此时当前节点已经没有左节点,所以按中序遍历原理,该根节点可以入vector了),入vector,当前节点再指向右(该节点左中都入vector了,该将右节点入vector了),然后循环。
(3.Morris迭代。
3.二叉树的后序遍历--简单
左右中。
(1.递归。
(2.迭代。咱们就是说,一整个茅塞顿开,恍然大悟啊。后序遍历是左右中,利用栈先入后出的特性,我们按中右左给节点压进去,最后反转一下vector就行了,
(3.Morris迭代。还不会
4.二叉树的层序遍历--简单
(1.递归。忘记depth这个可利用的数据了。
(2.迭代。一层一层入总vector,即:每次队列只会含有这一层的节点。注意,root!=nullptr是什么鬼循环判断条件啊。
5.对称二叉树--简单
队列用法:
q.front(),q.pop(),q.push()
思路:
(1.递归。不简述了,同上思路。要是世界的原理像递归一样简单就好了。
(2.迭代。简直了,递归就像dfs的代名词,迭代就是bfs的代名词(阿鸡瞎说,别打我)
用队列来存,先入队两个头节点,然后每次取出队列头部两个节点进行比较,false的就考虑false的情况,暂时没出错的就将root1->left,root2->right,root1->right,root2->left入队。
6.路径总和--简单
思路:
(1.递归。
(2.迭代。我发现dfs和bfs相对于别的算法没有那么多细节,基本上逻辑对了代码就对。
用两个队列分别存当前访问的节点和当前节点的路径总和。如果是叶子节点,检查总和是否等于目标总和。将该节点存在的子节点与其路径和入队,循环进行至队列为空(所有节点都遍历完)为止。
7.路经总和 II--中等
(1.递归。有意思的是回溯的话,vector也会跟着回溯,不需要删除上一轮加进去的元素。
8.二叉树的最小深度--简单
单纯就想把这个题作为风向标放这,证明我两种解法的码都是自己敲出来的,吾已小成!喔哈哈哈哈
9.平衡二叉树:
思路:
(1.自上而下递归。
(2.自下而上递归。有意思的是left和right都先等于其左右节点的子树的值,然后看是否高度相差大于1或者子树中有高度为-1,有则返回-1;没有则返回高子树+1。
彩蛋:
官方题解的优雅代码:
return max(maxDepth(root->left), maxDepth(root->right)) + 1;