二叉树的镜像( 翻转二叉树)、二叉树的镜像:输出二叉树的镜像(翻转二叉树)、通过判断原二叉树与其镜像是否相同判断二叉树是否对称
二叉树的镜像(翻转二叉树):
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
首先,使用递归方法,从根节点开始对树进行遍历,交换每个结点的左右子节点,即可得到二叉树的镜像,即翻转二叉树:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr)
return root;
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
其次,判断二叉树是否对称,即判断根节点的左右子树是否相互翻转,即原二叉树与其镜像完全相同),例如:
1
/ \
2 2
/ \ / \
3 4 4 3
此时需要考虑所有左右子树可能的情况,并且,不仅需要对左右子树进行判断,而且需要进一步对左右子树的子树进行判断,即二叉树的“里侧”和“外侧”。
对于当前遍历的结点root:
- left 与 right 有一个为 NULL,另一个不为 NULL,则一定不对称;
- left 与 right 同时为 NULL,满足对称条件,并且不需要继续向下进行判断;
- left 与 right 均不为 NULL,进一步判断其值是否相等,不相等则不满足对称条件。
经过上述判断后,只有在左右子树均不为 NULL 且值相等的情况下,进入单层递归逻辑处理,判断外侧(left->left, right->right)和内侧(left->right, right->left)是否均对称。
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);
}
};