文章目录
- 226.翻转二叉树
-
- 101. 对称二叉树
-
- 104.二叉树的最大深度
-
- 111.二叉树的最小深度
-
226.翻转二叉树
- 题目链接:226. 翻转二叉树 - 力扣(LeetCode)
- 讲解链接:代码随想录
- 状态:一遍AC。
思路与重点
- 注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果,使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了。
- 那么层序遍历可以不可以呢?依然可以的!只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的!
class Solution {
public:void traversal(TreeNode* cur, vector<int>& vec) {if (cur == NULL) return;vec.push_back(cur->val); traversal(cur->left, vec); traversal(cur->right, vec); }vector<int> preorderTraversal(TreeNode* root) {vector<int> result;traversal(root, result);return result;}
};
101. 对称二叉树
- 题目链接:101. 对称二叉树 - 力扣(LeetCode)
- 讲解链接:代码随想录
- 状态:一遍AC。
思路与重点
- 可以采用层序遍历,每一层去看是不是对称的。注意对于空着的节点,需要赋值101来进行比较。
class Solution {
public:bool isSymmetric(TreeNode* root) {bool ans = true;queue<TreeNode*> q;if(root) q.push(root);while(!q.empty()){vector<int> v;int size = q.size();for(int i = 0; i < size; i++){TreeNode* node = q.front();q.pop();if(!node) v.push_back(101);else v.push_back(node->val);if(node){q.push(node->left);q.push(node->right);}}for(int i = 0; i < size/2 ; i++){if(v[i] != v[size - i - 1]){ans = false;break;}}if(!ans) break;}return ans;}
};
- 对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。
- 也可以使用递归的做法:
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;else return compare(left->left, right->right) && compare(left->right, right->left);}bool isSymmetric(TreeNode* root) {if (root == NULL) return true;return compare(root->left, root->right);}
};
class Solution {
public:bool isSymmetric(TreeNode* root) {if (root == NULL) return true;queue<TreeNode*> que;que.push(root->left); que.push(root->right); while (!que.empty()) { TreeNode* leftNode = que.front(); que.pop();TreeNode* rightNode = que.front(); que.pop();if (!leftNode && !rightNode) { continue;}if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {return false;}que.push(leftNode->left); que.push(rightNode->right); que.push(leftNode->right); que.push(rightNode->left); }return true;}
};
104.二叉树的最大深度
- 题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)
- 讲解链接:代码随想录
- 状态:一遍AC。
思路与重点
class Solution {
public:int maxDepth(TreeNode* root) {if (root == NULL) return 0;int depth = 0;queue<TreeNode*> que;que.push(root);while(!que.empty()) {int size = que.size();depth++; for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return depth;}
};
class Solution {
public:int maxDepth(TreeNode* root) {if(!root) return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};
111.二叉树的最小深度
- 题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)
- 讲解链接:代码随想录
- 状态:一遍AC。
思路与重点
class Solution {
public:int minDepth(TreeNode* root) {if (root == NULL) return 0;int depth = 0;queue<TreeNode*> que;que.push(root);while(!que.empty()) {int size = que.size();depth++; for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);if (!node->left && !node->right) { return depth;}}}return depth;}
};
- 前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)
- 递归解决:求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。
int minDepth(TreeNode* root) {if(!root) return 0;int leftDepth = minDepth(root->left);int rightDepth = minDepth(root->right);if(leftDepth == 0 && rightDepth != 0) return rightDepth + 1;else if(leftDepth != 0 && rightDepth == 0) return leftDepth + 1;else return min(leftDepth, rightDepth) + 1;}