LeetCode: Symmetric Tree [101]

【题目】

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.

confused what "{1,#,2,3}" means? >
read more on how binary tree is serialized on OJ.

【题意】

给定一棵二叉树,判断这个二叉树是否自身左右对称

【思路】

只要判断根节点的左右子树是否对称即可。用递归实现

【代码】

/**
 * 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 isMirror(TreeNode* root1, TreeNode* root2){
        if(root1==NULL && root2==NULL)return true;
        if(root1==NULL || root2==NULL)return false;
        //判断根节点
        if(root1->val != root2->val)return false;
        //判断root1的左子树和root2的右子树是否镜面对称
        if(!isMirror(root1->left, root2->right))return false;
        //判断root1的右子树和root2的左子树是否镜面对称
        if(!isMirror(root1->right, root2->left))return false;

        return true;
    }

    bool isSymmetric(TreeNode *root) {
        if(root==NULL)return true;
        return isMirror(root->left, root->right);
    }
};

【思路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) {
        if(root==NULL)return true;
        TreeNode*leftPointer = root->left;  //遍历左子树的指针
        TreeNode*rightPointer = root->right;    //遍历右子树的指针
        stack<TreeNode*> st_left;       //遍历左子树的辅助栈
        stack<TreeNode*> st_right;      //遍历右子树的辅助栈

        //左子树使用先序遍历,右子树使用对称的方式完成先序遍历
        while(leftPointer && rightPointer){
            if(leftPointer->val != rightPointer->val)return false;
            st_left.push(leftPointer);
            st_right.push(rightPointer);
            leftPointer=leftPointer->left;
            rightPointer=rightPointer->right;
        }
        if(!(leftPointer==NULL && rightPointer==NULL))return false;  //如果对称,则leftPointer和rightPointer应该都是NULL

        while(!st_left.empty()&&!st_right.empty()){
            TreeNode* topLeft=st_left.top();    st_left.pop();
            TreeNode* topRight=st_right.top();  st_right.pop();
            leftPointer = topLeft->right;
            rightPointer = topRight->left;

            while(leftPointer && rightPointer){
                if(leftPointer->val != rightPointer->val)return false;
                st_left.push(leftPointer);
                st_right.push(rightPointer);
                leftPointer=leftPointer->left;
                rightPointer=rightPointer->right;
            }
            if(!(leftPointer==NULL && rightPointer==NULL))return false;  //如果对称,则leftPointer和rightPointer应该都是NULL
        }

        return st_left.empty()&&st_right.empty();
    }
};

LeetCode: Symmetric Tree [101]

时间: 2024-10-06 00:39:57

LeetCode: Symmetric Tree [101]的相关文章

Leetcode:Symmetric Tree 判断对称树

Symmetric Tree 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 解题分析: 二叉树递归,始终是第一颗二叉树的左子树和第二颗二叉树的右

LeetCode: Symmetric Tree 解题报告

Symmetric Tree 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  3But the following is not:    1   / \  2   2   \   \   3    3Note:

Microsoft leetcode (Symmetric Tree)

Symmetric Tree Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For example, this binary tree [1,2,2,3,4,4,3] is symmetric: 1 / 2 2 / \ / 3 4 4 3 But the following [1,2,2,null,3,null,3] is not: 1 / 2 2 \

[leetcode]Symmetric Tree @ Python

原题地址:https://oj.leetcode.com/problems/symmetric-tree/ 题意:判断二叉树是否为对称的. 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 i

[Leetcode] Symmetric tree 对称二叉树

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 rec

LeetCode -- Symmetric Tree

Question: 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

LeetCode——Symmetric Tree

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 中文:给定一二叉树,检查它是否是它自己的镜像(比如,以中心对称). 递归: public bool

[leetcode] Symmetric Tree--二叉树遍历的应用

题目: 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 分析: 题目是要判断左右两颗子树是否对称,采用只要根节点的值相同,并且左边子树的左子树和右

leetcode:Symmetric Tree【Python版】

#error caused by:#1:{} 没有考虑None输入#2:{1,2,2} 没有控制h和t#3:{4,-57,-57,#,67,67,#,#,-97,-97} 没有考虑负号,将s从str变成list,采用9999代表空数值: --------------------- 逐层进行对称性验证,出现不对称就结束: 1 # Definition for a binary tree node 2 # class TreeNode: 3 # def __init__(self, x): 4 #