美文网首页
Symmetric Tree(对称树)

Symmetric Tree(对称树)

作者: 静水流深ylyang | 来源:发表于2019-01-04 22:36 被阅读0次

    题目描述

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

    But the following is not:

    Note:
    Bonus points if you could solve it both recursively and iteratively.
    confused what"{1,#,2,3}"means? > read more on how binary tree is serialized on OJ.
    OJ's Binary Tree Serialization:
    The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
    Here's an example:

    The above binary tree is serialized as"{1,2,3,#,#,4,#,#,5}".

    题目大意

    判断一棵树是否是对称树。

    要注意,对称树是一棵树的左右子树互为镜面;
    所以是左子树的左孩子==右子树的右孩子。
    这点要区别于相等树。

    相等二叉树:左子树的左孩子==右子树的左孩子

    思路

    可以用递归也可以把递归改成非递归(所有的递归都可以改写成非递归的形式)。

    不管递归还是非递归,判断条件都是一样的,
    (1)首先判断当前结点是否为NULL,如果都为NULL,显然是相等的,
    (2)如果不是两棵树的当前结点都为NULL,其中有一个为NULL,那么两棵树必不相等,
    (3)如果两棵树的两个结点的值不相等,那么两棵树必不相等。条件判断完后,说明当前结点相等且不为NULL。接下来就再判断当前结点的左右子树,在递归方法中,用递归手段去判断;在非递归方法中,将当前结点的左右孩子结点入队,在去循环判断。由此可见,递归、非递归,思想是一样的。
    但是在入队的时候要注意,因为是判断是否是镜像树,所以一棵树以左右孩子子树的顺序入队,另一棵树要以右左孩子的顺序入队。

    代码

    递归

    #include<iostream>
    #include<queue>
    using namespace std;
    
    // Definition for binary tree
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    bool isSymmetric(TreeNode *root)
    {
        if(root == NULL)return true;
        return help_fun(root->left, root->right);
    }
    
    bool help_fun(TreeNode *root1, TreeNode *root2)
    {
        if(root1==NULL && root2==NULL)return true;
        else if(root1==NULL || root2==NULL)return false;
        else if(root1->val != root2->val)return false;
        // 注意:第一棵树的左孩子与第二颗树的右孩子比较
        // 第二颗树的右孩子与第一棵树的左孩子相比较
        return help_fun(root1->left, root2->right) && help_fun(root1->right, root2->left);
    }
    
    int main()
    {
    
        return 0;
    }
    

    非递归

    #include<iostream>
    #include<queue>
    using namespace std;
    
    // Definition for binary tree
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    typedef TreeNode* tree;
    bool isSymmetric(TreeNode *root)
    {
        if(root == NULL)return true;
        queue<tree> q1, q2;
        // 把根结点的左右子树分别看成一棵树,判断这两棵树是否对称
        q1.push(root->left);
        q2.push(root->right);
        while(!q1.empty() && !q2.empty())
        {
            tree tmp1 = q1.front();
            tree tmp2 = q2.front();
            // 记得出队
            q1.pop(); q2.pop();
            // 当前结点都为NULL,就继续去比较队内其他结点
            if(tmp1==NULL && tmp2==NULL)continue;
            // 只有一个结点为NULL,另一个结点非NULL,必不对称
            else if(tmp1==NULL || tmp2==NULL)return false;
            // 结点值不相等,必不对称
            else if(tmp1->val != tmp2->val)return false;
            // 前面三个判断条件都没有走,说明tmp1和tmp2都非NULL
            // 就把他们的左右孩子入队
            // 注意:第一个入队顺序为:1. 左 2. 右
            q1.push(tmp1->left);
            q1.push(tmp1->right);
            // 注意:第二个入队顺序为:1. 右 2. 左
            q2.push(tmp2->right);
            q2.push(tmp2->left);
        }
        // 两个队列有一个非NULL,说明必不对称
        if(!q1.empty() || !q2.empty())return false;
        return true;
    }
    int main()
    {
    
        return 0;
    }
    

    以上。

    相关文章

      网友评论

          本文标题:Symmetric Tree(对称树)

          本文链接:https://www.haomeiwen.com/subject/gwrlrqtx.html