每天一道LeetCode-----判断二叉树左右两边是否成镜像关系
2017-12-26 14:37
666 查看
Symmetric Tree
原题链接Symmetric Tree判断给定的二叉树和自身是否成镜像关系
以二叉树根节点为中心做垂线,两边正好是相反的才叫镜像,以两个值为2的节点leftNode和rightNode为例
需要满足
leftNode->val == rightNode->val;
leftNode->left->val == rightNode->right->val;
leftNode->right->val == rightNode->left->val;
当然,使用递归是比较方便的,从根节点开始向下,逐个比较,即如果满足leftNode->val == rightNode->val,那么,需要让他们的子节点也同样满足镜像规则,只需要递归
isSymmetric(leftNode->left, rightNode->right) && isSymmetric(leftNode->right, rightNode->left);
每次进入isSymmetric函数时,参数的两个节点都来自根节点的两边,所以可以判断是否是镜像
代码如下
/** * 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) { return !root || isSymmetric(root->left, root->right); } private: bool isSymmetric(TreeNode* leftNode, TreeNode* rightNode) { if(!leftNode && !rightNode) return true; if((leftNode && !rightNode) || (!leftNOde && rightNode)) return false; if(leftNode->val != rightNode->val) return false; return isSymmetric(leftNode->left, rightNode->right) && isSymmetric(leftNode->right, rightNode->left); } };
迭代法只是简单的用队列维护遍历到的节点,思路都一样
代码如下
/** * 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; queue<TreeNode*> lq, rq; lq.push(root->left); rq.push(root->right); while(!lq.empty() && !rq.empty()) { TreeNode* leftNode = lq.front(); TreeNode* rightNode = rq.front(); lq.pop(); rq.pop(); if(!leftNode && !rightNode) continue; if((leftNode && !rightNode) || (!leftNode && rightNode)) return false; if(leftNode->val != rightNode->val) return false; lq.push(leftNode->left); rq.push(rightNode->right); lq.push(leftNode->right); rq.push(rightNode->left); } return lq.empty() && rq.empty(); } };
递归还是比较容易写出的,需要注意镜像是在根节点两边对称,而不是每个节点的左右子树对称,递归时传入的参数要注意
相关文章推荐
- 每天一道LeetCode-----判断两个二叉树是否相同
- 每天一道LeetCode-----计算二叉树的最大深度及最小深度,判断二叉树是否是高度平衡二叉树
- 每天一道LeetCode-----判断给定字符串是否符合某个模式
- 【LeetCode题目记录-11】判断二叉树是否是镜像的(对称的)
- 每天一道LeetCode-----判断链表是否有环,如果有,找到环的入口位置
- 每天一道LeetCode-----存在一个由加油站组成的环路,判断是否可以从某个加油站出发环绕一周
- 每天一道LeetCode-----判断一个数是否是happy number(每一位的平方和最终为1)
- 每天一道LeetCode-----判断某棵树是否是二叉搜索树
- 产生树的镜像,判断一棵树是否为对称二叉树
- LeetCode--判断二叉树是否对称
- leetcode的判断一个二叉树是否是平衡树
- leetcode_Symmetric Tree_判断二叉树镜像对称_easy_方法
- 每天一道LeetCode-----计算二叉树所有根节点到叶子节点的和
- LeetCode基础--二叉树-判断二叉树是否平衡
- 判断二叉树是否平衡、求二叉树的镜像、按行列有序矩阵中快速查找元素是否存在
- 每天一道算法题1 判断字符串是否是回文字符串或者是否含有回文字符子串
- leetcode_110. Balanced Binary Tree 判断一棵二叉树是否为平衡二叉树
- leetcode 二叉树是否为镜像对称
- [LeetCode] Symmetric Tree 判断二叉树是否为对称二叉树
- 101. Symmetric Tree | 判断二叉树是否为镜像二叉树