我们设计一个递归函数 dfs,它接收两个参数 a 和 b,分别代表两棵树的根节点。我们可以对 a 和 b 进行如下判断:
如果 a 和 b 都为空,说明两棵树都遍历完了,返回 true;
如果 a 和 b 中有且只有一个为空,说明两棵树的结构不同,返回 false;
如果 a 和 b 的值不相等,说明两棵树的结构不同,返回 false;
如果 a 和 b 的值相等,那么我们分别递归地判断 a 的左子树和 b 的右子树,以及 a 的右子树和 b 的左子树是否对称。
最后,我们返回 dfs(root, root),即判断 root 的左子树和右子树是否对称。
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。
1 2 3 4 5 6 7 8 9101112131415161718
# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = NoneclassSolution:defisSymmetric(self,root:TreeNode)->bool:defdfs(a,b):ifaisNoneandbisNone:returnTrueifaisNoneorbisNoneora.val!=b.val:returnFalsereturndfs(a.left,b.right)anddfs(a.right,b.left)returndfs(root,root)
1 2 3 4 5 6 7 8 9101112131415161718192021222324
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */classSolution{publicbooleanisSymmetric(TreeNoderoot){returndfs(root,root);}privatebooleandfs(TreeNodea,TreeNodeb){if(a==null&&b==null){returntrue;}if(a==null||b==null||a.val!=b.val){returnfalse;}returndfs(a.left,b.right)&&dfs(a.right,b.left);}}
1 2 3 4 5 6 7 8 9101112131415161718192021222324
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */classSolution{public:boolisSymmetric(TreeNode*root){function<bool(TreeNode*,TreeNode*)>dfs=[&](TreeNode*a,TreeNode*b)->bool{if(!a&&!b){returntrue;}if(!a||!b||a->val!=b->val){returnfalse;}returndfs(a->left,b->right)&&dfs(a->right,b->left);};returndfs(root,root);}};
1 2 3 4 5 6 7 8 9101112131415161718192021
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcisSymmetric(root*TreeNode)bool{vardfsfunc(a,b*TreeNode)booldfs=func(a,b*TreeNode)bool{ifa==nil&&b==nil{returntrue}ifa==nil||b==nil||a.Val!=b.Val{returnfalse}returndfs(a.Left,b.Right)&&dfs(a.Right,b.Left)}returndfs(root,root)}
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } *//** * @param {TreeNode} root * @return {boolean} */varisSymmetric=function(root){constdfs=(a,b)=>{if(!a&&!b){returntrue;}if(!a||!b||a.val!=b.val){returnfalse;}returndfs(a.left,b.right)&&dfs(a.right,b.left);};returndfs(root,root);};
1 2 3 4 5 6 7 8 9101112131415161718192021222324
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int x) { val = x; } * } */publicclassSolution{publicboolIsSymmetric(TreeNoderoot){returndfs(root,root);}privatebooldfs(TreeNodea,TreeNodeb){if(a==null&&b==null){returntrue;}if(a==null||b==null||a.val!=b.val){returnfalse;}returndfs(a.left,b.right)&&dfs(a.right,b.left);}}