代码随想录算法训练营第十五天(BFS)|102.二叉树的层序遍历, 107.二叉树的层次遍历 II,99.二叉树的右视图...

DFS:stack

BFS:queue

咱就背模板吧朋友们(doge)

(刷题以来题目增长最快的一天,让我们说谢谢二叉树!)

迭代

代码随想录算法训练营第十五天(BFS)|102.二叉树的层序遍历, 107.二叉树的层次遍历 II,99.二叉树的右视图..._第1张图片

 要点:

1. 别忘了先q.push(root)! 要不然queue是空的直接输出了

2. queue获取第一个元素是front()

102.二叉树的层序遍历

力扣

107.二叉树的层次遍历 II

力扣

最后reverse result

99.二叉树的右视图

力扣

每一层到 i == size-1时(即这一层最右),放到result vector里即可

637.二叉树的层平均值

力扣

要搞清每步是在做什么,然后根据题意做出改变

429.N叉树的层序遍历

力扣

515.在每个树行中找最大值

力扣

注意题目没有提到全是正数,所以设置初始max时,设置为INT_MIN,而不是0

116.填充每个节点的下一个右侧节点指针

力扣

117.填充每个节点的下一个右侧节点指针II

力扣

104.二叉树的最大深度

力扣

也可以: 1+ max (maxDepth(root->left), maxDepth(root->right)), 注意查root != nullptr

后面几天估计会讲

111.二叉树的最小深度

力扣

左右child都为nullptr则说明到最低点了,这时就可以算root到这个点的距离

可以设置一个hasChild = false,如果有左或右child就改为true。如果后面依然是false则返回此时的depth。

 

226.翻转二叉树 (优先掌握递归)

力扣

BFS迭代:

和上面所有题的模板类似。对每一个节点(得到TreeNode* node = q.front()后),swap一下(node->left, node->right)即可。

DFS递归:

注意终止条件为:if(root == nullptr) return root。别忘了最后也要return root

swap(root->left, root->right); //中
invertTree(root->left); //左
invertTree(root->right); //右

1. pre-order - 中左右

2. post-order - 左右中

3. in-order - 左中右

注意:在翻转完“左”后,“中”会swap一次左右。此时原本的“右”又变成了“左”。所以如果要用in-order则需要:

invertTree(root->left);
swap(root->left, root->right);
invertTree(root->left); //!此处还是“左”!

DFS迭代:还需多复习之前的模板

101. 对称二叉树(先掌握递归)

力扣

代码随想录算法训练营第十五天(BFS)|102.二叉树的层序遍历, 107.二叉树的层次遍历 II,99.二叉树的右视图..._第2张图片

需要比较左右两子树,分别从外侧比到里侧。也就是说,左边的树是【左右中】遍历,右边的树是【右左中】遍历,结果都是【外里中】。两者结果若是一样就说明是对称的。

Outside: 比较left->left & right->right

Inside: 比较left->right & right->left

注意:

1. 写递归时,要先确认有没有特殊情况(例如两边为空节点),要先讨论完这些情况,该return的return,然后再进入递归逻辑。

2. 对于helper function,想要实际比较什么东西,参数就设为什么(例如本题中的左右子树)

3. 主方法中,别忘了root == nullptr也是对称的,应该return true。

你可能感兴趣的:(宽度优先,算法,数据结构,leetcode,c++)