本文参考:@代码随想录@程序员Carl
目录
层序遍历 10
思路:使用queue,先进先出,符合一层层遍历的特点。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
//用来存放node的队列
queue<TreeNode*> que;
//首先将根节点放入队列
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
//vec用来记录这一层的所有value
vector<int> vec;
//for循环遍历元素个数为size的一层
// for循环的条件一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
for (int i = 0; i < size; i++) {
//记录队列的第一个元素,然后将它从队列里删除,同时加入vec
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
//判断我们刚刚记录的node是否有左右孩子,如果有,将孩子加入队列
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
//将这一层的结果放入result
result.push_back(vec);
}
return result;
}
};
利用上面的代码模板,可以写完下面10道题,你说赚不赚( ̄▽ ̄)
- 107.二叉树的层次遍历II(opens new window)
- 199.二叉树的右视图(opens new window)
- 637.二叉树的层平均值(opens new window)
- 429.N叉树的层序遍历(opens new window)
- 515.在每个树行中找最大值(opens new window)
- 116.填充每个节点的下一个右侧节点指针(opens new window)
- 117.填充每个节点的下一个右侧节点指针II(opens new window)
- 104.二叉树的最大深度(opens new window)
- 111.二叉树的最小深度
226.翻转二叉树
思路:利用前序遍历或后序遍历,以及递归,翻转每个节点的左右节点。例如下面这张图:先翻转4的左右节点,第一层和第二层反转完毕;然后依次翻转2和7的左右节点,第三层反转完毕。
递归三部曲:
1.确定函数的参数和返回值:
TreeNode* invertTree(TreeNode* current)
2.确定终止条件,当该节点为空时就返回:
if(current==nullptr) return current;
3. 确定单层递归的逻辑
因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
力扣完整代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* invertTree(TreeNode* current) {
//遍历到的节点为空就直接返回
if(current==nullptr) return current;
//前序遍历
//交换左右节点
swap(root->left,root->right);
//遍历左子树
invertTree(root->left);
//遍历右子树
invertTree(root->right);
return root;
}
};
101.对称二叉树 2
电脑坏了,用手机编辑的,只能凑合着看了。
思路:递归。判断是否是二叉树,要比较的是根节点的左右子树是否是互相翻转的。也就是比较两个子树里侧和外侧的元素是否相等,如图:
代码: