今日内容:
● 层序遍历 10
● 226.翻转二叉树
● 101.对称二叉树 2
层序遍历 10
要点:返回的是每一层的元素! vector<vector<int>>
辅助:队列(每pop根,加入左右子树)
控制每次加入vec的元素个数, 第一层的size()=1 第二层 size() 就是第一层产生的子结点
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*>que; //两个辅助
vector<vector<int>>result;
if(!root) return result;
que.push(root);
while(!que.empty()){ //队列不空
int size = que.size(); //弹出个数的计算(结合图片思考)
vector<int>vec;
while(size--){
TreeNode* temp = que.front();
que.pop();
vec.push_back(temp->val);
if(temp->left) que.push(temp->left);
if(temp->right) que.push(temp->right);
}
result.push_back(vec);
}
return result;
}
};
自底向上:
reverse(result.begin(),result.end());
return result;
每一层最右的结点
层序代码:每一层的最后一个结点保存到result
if(size==0)
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
queue<TreeNode*>que; //两个辅助
vector<int>result;
if(!root) return result;
que.push(root);
while(!que.empty()){ //队列不空
int size = que.size(); //弹出个数的计算(结合图片思考)
while(size--){
TreeNode* temp = que.front();
que.pop();
if(size==0){
result.push_back(temp->val);
}
if(temp->left) que.push(temp->left);
if(temp->right) que.push(temp->right);
}
}
return result;
}
};
老版本,算完sum,再/size()
226.翻转二叉树 (前序遍历 )
前序,后序实现:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) { //第一步 返回+参数
if (root == NULL) return root; //第二部:终止条件
swap(root->left, root->right); // 中 第三步:开始操作
invertTree(root->left); // 左
invertTree(root->right); // 右
return root;
}
};
101.对称二叉树 2 (前序遍历 先判断根)
我的写法:
1.递归bool,参数:左根,右根
2.返回情况:二者都是空:true
二者只有一个是空:true
二者数值不等:false
3.return 当左右结点相等的时候,才能确定相等!!!
class Solution {
public:
bool compare(TreeNode* root1, TreeNode* root2) {
if (root1 == nullptr && root2 == nullptr) return true;
if (root1 == nullptr || root2 == nullptr) return false;
if (root1->val != root2->val) return false;
return compare(root1->left, root2->right) && compare(root1->right, root2->left);
}
bool isSymmetric(TreeNode* root) {
if (root == nullptr) return true;
return compare(root->left, root->right);
}
};