每天一道LeetCode-----判断二叉树左右两边是否成镜像关系

来源:互联网 发布:淘宝上海故事披肩 编辑:程序博客网 时间:2024/05/21 11:30

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();    }};

递归还是比较容易写出的,需要注意镜像是在根节点两边对称,而不是每个节点的左右子树对称,递归时传入的参数要注意

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 王少杰北控 北控队 北控王少杰 北控水务集团 马布里签约北控 北控男篮名单 北京北控篮球队 王少杰北控首场比赛 北京北控男篮名单 辽宁男篮对北控 王少杰北控首秀得分 北京北控篮球俱乐部 北京北控男篮 北控集团下属企业名录 北控集团全部公司 北控男篮2018年人员名单 北控城市资源集团 北控水务建设发展有限公司 洛阳北控水务24小时服务电话 北控城市服务 北控集团旗下企业 无锡北控雁栖湖 北阳台改书房 2018年成都北改新方案 北改 北斋 fgo北斋为什么叫阿荣 大宋北斗司 北斗 北斗神拳 北斗卫星 大宋北斗 北斗九星 北斗gps 北斗手机 北斗导航app 北斗系统 泰山北斗 北斗app 北斗图片 北斗网