class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr) return nullptr;
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
invertTree(root->left);
invertTree(root->right);
return root;
}
};
解析:基本的递归操作,先找到终止条件是root == nullptr ,让后模拟左右反转。然后看成基元操作, 假定已经实现功能的基元操作,最后返回root节点。
leetcode 对称二叉树https://leetcode.cn/problems/symmetric-tree/submissions/
class Solution {
public:
bool isD(TreeNode* left,TreeNode* right)
{
if(left==nullptr&&right==nullptr) return true;
if(left==nullptr||right==nullptr||left->val!=right->val) return false;
return isD(left->left,right->right) && isD(left->right,right->left);
}
bool isSymmetric(TreeNode* root) {
if(root==nullptr) return true;
return isD(root->left,root->right);
}
};
解析: 对称二叉树,终止条件,执行条件运用了过关斩将法,把不可能的的答案排除,留下最后一种才能通关,此时应该缩小视角,将对比条件看成一个个小的节点,而不是一个二叉树。
二叉树的层序遍历:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> vec;
// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
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;
}
};
不多说直接背下来