二叉树学习2
226题翻转二叉树,改一下前序递归遍历,每次遍历的时候都调换一下左右结点即可。
class Solution {
public:
void preorder(TreeNode *root) {if (root == nullptr) {return;}TreeNode* tmp;tmp = root->left;root->left = root->right;root->right = tmp;preorder(root->left);preorder(root->right);}TreeNode* invertTree(TreeNode* root) {preorder(root);return root;}
};
101判定是不是对称二叉树,我的做法太麻烦了,对两棵树分别遍历(中左右 中右左),再比较值是否相同,其实可以放在一个函数里一次性解决。
class Solution {
public:void preorder1(TreeNode *root, vector<int> &res) {if (root == nullptr) {res.push_back(-101);return;}res.push_back(root->val);preorder1(root->left, res);preorder1(root->right, res);}void preorder2(TreeNode *root, vector<int> &res) {if (root == nullptr) {res.push_back(-101);return;}res.push_back(root->val);preorder2(root->right, res);preorder2(root->left, res);}bool isSymmetric(TreeNode* root) {vector<int> res;vector<int> ans;preorder1(root->left, res);preorder2(root->right, ans);// 比较两个数组for (int i = 0; i < res.size(); i++) {if (res[i] != ans[i]) return false;}return true;}
};
104题二叉树的最大深度 111题二叉树的最小深度在上一节完成了
class Solution {
public:int maxDepth(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);vector<vector<int>> result;int depth = 0;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);depth++;}return depth;}
};
class Solution {
public:int minDepth(TreeNode* root) {if (!root) {return 0;}queue<TreeNode*> que;que.push(root);int depth = 0;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 && !node->right) {return ++depth;}if (node->left) que.push(node->left);if (node->right) que.push(node->right);}depth++;}return depth;}
};