前言:
我将会利用几天把树的经典例题都刷完,希望我可以坚持下去。
226. 翻转二叉树 - 力扣(LeetCode)
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
解题思路:我们交换每一层的左右节点就可以了,写一个递归,每一次传入一个节点,交换这个节点的左节点和右节点,再把分别把左节点和右节点作为新的节点参数传入这个函数中进行新一轮的交换,直到当前节点为空为止,
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);
swap(root->left,root->right);
invertTree(root->left);
return root;
}
};
我们的第一个left是对树的真正左节点进行翻转,而第二个left是对此时 已经变成左节点 的右节点进行翻转,这样就可以实现通过中序遍历来对树进行翻转。
101. 对称二叉树 - 力扣(LeetCode)
给你一个二叉树的根节点 root
, 检查它是否轴对称。
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;
// 此时就是:左右节点都不为空,且数值相同的情况
// 此时才做递归,做下一层的判断
bool outside = compare(left->left, right->right); // 左子树:左、 右子树:右
bool inside = compare(left->right, right->left); // 左子树:右、 右子树:左
bool isSame = outside && inside; // 左子树:中、 右子树:中 (逻辑处理)
return isSame;
}
bool isSymmetric(TreeNode* root) {
if (root == NULL) return true;
return compare(root->left, root->right);
}
};
总结:
树的题型有很多,我们要多做多练,才可以更加娴熟的掌握树这种数据结构。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!