给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1
/ \
2 2
\ \
3 3
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
对称二叉树的左子树的前序遍历等于右子树的后序遍历的逆
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
bli = [] # 用来存储左子树的前序遍历
fli = [] # 用来存储右子树的后序遍历
if root is None:
return True
if root and root.left == None and root.right == None: # 只有根节点
return True
if root and root.left and root.right:
self.pre_order(root.left, bli)
self.post_order(root.right, fli)
fli.reverse() # 将后序遍历的列表倒序
if bli == fli:
return True
else:
return False
def pre_order(self,root,li):
if root:
li.append(root.val)
self.pre_order(root.left,li)
self.pre_order(root.right,li)
elif root is None:
li.append(None)
def post_order(self,root,li):
if root:
self.post_order(root.left,li)
self.post_order(root.right,li)
li.append(root.val)
elif root is None:
li.append(None)
c++用dfs来做
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return dfs(root->left,root->right);
}
private:
bool dfs(TreeNode* root1, TreeNode* root2){
if(!root1&&!root2) return true;
if(!root1||!root2) return false;
if(root1->val!= root2->val) return false;
return dfs(root1->left,root2->right) && dfs(root1->right,root2->left);
}
};