判断一颗二叉树是否是镜面(即轴对称)。
Leecode表示二叉树:
{1,#,2,3}
是层次遍历的结果,#表示节点为空。
【思路】
1.我的思路,镜面树一个特征,把左树的左右孩子都交换,就和右树完全一样。
所以另写两个函数,都使用递归,一个是判断两树是否相等。
2.别人的思路,用一个树的左树比较另一棵树的右树,右树比较左树(虽然很容易想到,但不太会实现递归)
bool isSymmetric(TreeNode *root) { if(root==NULL) return true; trans(root->left); return isSameTree(root->left,root->right); } void trans(TreeNode *root) { if(root&&(root->left||root->right)) { TreeNode *temp=root->left; root->left=root->right; root->right=temp; trans(root->left); trans(root->right); } else return; } bool isSameTree(TreeNode *p, TreeNode *q) { if(!( (p && q && p->val==q->val) || (p==NULL && q==NULL))) return false; if(p==NULL || q==NULL) return true; return isSameTree(p->left,q->left) && isSameTree(p->right,q->right); }
【other code】
bool dfs(TreeNode *left,TreeNode *right) { if(!left && !right) return true;//需要先判断这个,不然val那个可能会出现RE if((left && !right) || (!left && right) || (left->val!=right->val)) return false; return dfs(left->left,right->right) && dfs(left->right,right->left); } bool isSymmetric(TreeNode *root) { if(root==NULL || (!root->left && !root->right)) return true; return dfs(root->left,root->right); }
【评价】
看人家的代码还是漂亮些,其实dfs还是判断两树是否相等。
我的那个trans还是写的挺好的O(∩_∩)O哈哈~