102.层序遍历
思路:层序遍历,就是图论中的广度优先遍历,只不过我们应用在二叉树上。我们需要借助一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> result;
if(root) que.push(root);
while(!que.empty()){
int size=que.size();
vector<int> vec;
while(size--){
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;
}
};
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;
}
};
后序遍历:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {//确定函数的返回值和参数
//确定终止条件
if(root==NULL) return root;
//确定单层递归的逻辑
invertTree(root->left);
invertTree(root->right);
swap(root->left,root->right);
return root;
}
};
注意,最后还是返回root,进入递归函数后root就不是真正的root了,相当于在主函数里,root没有改变过,所以最后还可以返回root。
101.对称二叉树
思路:
1、确定递归函数的参数和返回值:我们要比较的是根节点的两颗子树是否可以相互反转,进而判断这棵树是不是对称树,所以要比较的是两棵树,参数自然也是左子树节点和右子树节点。
根据题目描述,返回值应该是bool类型。
2、确定终止条件,左空右不空,左不空右空,左右值不相等都停止递归向上返回false,左空右空也停止递归,但返回true。剩下的就是左右不为空,且数值相等的情况。
3、单层递归的逻辑:就是处理左右不为空,数值相等的情况。
比较二叉树外侧是否对称,传入左节点的左孩子,右节点的右孩子。
比较二叉树内侧是否对称,传入左节点的右孩子,右孩子的左孩子。
如果外侧和内侧都对称就返回true,否则返回false。
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right){//确定递归函数参数和返回值
//确定终止条件
if(left!=NULL&&right==NULL) return false;
else if(left==NULL&&right!=NULL) return false;
else if(left==NULL&&right==NULL) return true;
else if(left->val!=right->val) return false;//节点为空都已经判断完了,不用担心操作空指针//这里很巧妙,左右都为空,也是终止条件,但返回true
//刚刚没有用else,而是用else if,因为我们把以上情况都排除以后剩下的就是左右节点都不为空,且数值相同的情况
//进入单层递归的逻辑
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);
}
};