101. Symmetric Tree

来源:互联网 发布:编程电脑配置要求2017 编辑:程序博客网 时间:2024/05/29 23:45

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1   / \  2   2 / \ / \3  4 4  3

 

But the following is not:

    1   / \  2   2   \   \   3    3

Note:
Bonus points if you could solve it both recursively and iteratively.

算法1:递归解法,判断左右两颗子树是否对称,只要两颗子树的根节点值相同,并且左边子树的左子树和右边子树饿右子树对称 且 左边子树的右子树和右边子树的左子树对称   

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool isSymmetric(TreeNode *root) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.        if(root == NULL)return true;        return isSymmetricRecur(root->left, root->right);    }    bool isSymmetricRecur(TreeNode *root1, TreeNode *root2)    {        if(root1 != NULL && root2 != NULL)        {            if(root1->val == root2->val &&                 isSymmetricRecur(root1->left, root2->right) &&                isSymmetricRecur(root1->right, root2->left))                return true;            else return false;                    }        else if(root1 != NULL || root2 != NULL)            return false;        else return true;            }};
算法2:非递归解法,用两个队列分别保存左子树节点和右子树节点,每次从两个队列中分别取出元素,如果两个元素的值相等,则继续把他们的左右节点加入左右队列。要注意每次取出的两个元素,左队列元素的左孩子要和右队列元素的右孩子要同时不为空或者同时为空,否则不可能对称,同理左队列元素的右孩子要和右队列元素的左孩子也一样。

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool isSymmetric(TreeNode *root) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.        if(root == NULL)return true;        queue<TreeNode*> qleft, qright;        if(root->left)qleft.push(root->left);        if(root->right)qright.push(root->right);        while(qleft.empty() == false && qright.empty() == false)        {            TreeNode *ql = qleft.front();            TreeNode *qr = qright.front();            qleft.pop();  qright.pop();            if(ql->val == qr->val)            {                if(ql->left && qr->right)                {                    qleft.push(ql->left);                    qright.push(qr->right);                }                else if(ql->left || qr->right)                    return false;                if(qr->left && ql->right)                {                    qleft.push(qr->left);                    qright.push(ql->right);                }                else if(qr->left || ql->right)                    return false;            }            else return false;        }        if(qleft.empty() && qright.empty())            return true;        else return false;    }};



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 C#网络通信 C语言笔试 ucos qt包含文件 科大讯飞java 1,定义一个接口Assaultable(可攻击的),该接口有一个抽象方法attack()。2,定义一 FlyAudioVoice 2023 编写一个应用程序绘制一个如下的操作菜单并实现功能(定义一个类学生表示学生,有成员变量姓名name和年 Minecraft 1204:剔除相关数 平坦衰落信道2FSK差错性能分析 平坦衰落信道 编写一个应用程序绘制一个如下的操作菜单并实现功能(定义一个类学生表示学生,有成员变量姓名name和年 手机是现在人们必不可少、最重要的通讯工具,拥有一款简单、实用、易用的手机通讯录,将会使你的手机更加好 手机是现在人们必不可少、最重要的通讯工具,拥有一款简单、实用、易用的手机通讯录,将会使你的手机更加好 编写一个应用程序绘制一个如下的操作菜单并实现功能(定义一个类学生表示学生,有成员变量姓名name和年 61858 61850 全国市级城市拼音 pycr rpyc pry 安德地产公司 安德地产年报 pycharm安装 高文 李皓 王煊 赵瀚 夜的命名术 我的治愈系游戏 全职艺术家 星门 长夜余火 不科学御兽 十方武圣 黎明之剑 深空彼岸 稳住别浪 这个人仙太过正经