注意点:
1.queue的头是front,stack是top
2.一定要注意设置queue的size,因为队列中的程序遍历的size是不断变化的,例如题目中的,4进去了,1和3直接就加进去了
/**
* 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) {
queue<TreeNode*> que;
vector<vector<int>> result;
if(root != nullptr) que.push(root);
while(!que.empty()) {
int size = que.size();
vector<int> vec;
for(int i =0; i<size; i++) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
result.push_back(vec);
}
return result;
}
};
这些题都是在原有的基础之上进行略微改变的
- 107.二叉树的层次遍历II
- 199.二叉树的右视图
- 637.二叉树的层平均值
- 429.N叉树的层序遍历
- 515.在每个树行中找最大值
- 116.填充每个节点的下一个右侧节点指针
- 117.填充每个节点的下一个右侧节点指针II
- 104.二叉树的最大深度
- 111.二叉树的最小深度
注意点:
1.采用递归的方法,首先考虑是前序-中左右、中序-左中右、后序-左右中;但是中序不行,如果采用中序,代码如代码块所示,中序的遍历方式和前序和后序不太一样
2.递归三步骤:
2.1确定递归函数的参数和返回值 TreeNode* --返回值 (TreeNode* root)--参数
2.2终止条件if(root == nullptr) return root;
2.3 确定单层递归的逻辑--前序 中序 或者后序
/**
* 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* root) {
if(root == nullptr) return root;
//前序
swap(root->left, root->right); //中
invertTree(root->left);//左
invertTree(root->right);//右
return root;
}
};
/*后序
invertTree(root->left);//左
invertTree(root->right);//右
swap(root->left, root->right); //中
中序
invertTree(root->left);//左
swap(root->left, root->right); //中
invertTree(root->left);//右
*/
注意点:
1.本题主要是将左边的左孩子和右边的右孩子进行比较,如果二者相等,则返回true;
2.应用迭代-迭代三部曲
2.1确定递归参数和返回值
2.2确定终止条件
2.3确定单层递归逻辑
3.注意本题只能用后序遍历,因为最终需要将左边左孩子与右边右孩子 && 左边右孩子与右边左孩子进行“&”操作,中序最后是左右中,最终在中进行汇总。
/**
* 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:
bool compare(TreeNode* left, TreeNode* right) {//确定递归函数的参数和返回值
//确定终止条件
if(left == nullptr && right != nullptr) return false;
else if(left != nullptr && right == nullptr) return false;
else if(left == nullptr && right == nullptr) return true;
else if(left->val != right->val) return false;
//确定单层递归逻辑
bool outside = compare(left->left,right->right);//左
bool inside = compare(left->right, right->left);//右
bool result = outside && inside;//中
return result;
}
bool isSymmetric(TreeNode* root) {
if(root == nullptr) return true;
return compare(root->left, root->right);
}
};