剑指offer:面试题28. 对称的二叉树

题目:对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

解题:

方法一:递归

 T:O(n) S:O(n)

镜像二叉树满足3个条件:

  • 根节点相同
  • 左孩子 与 右孩子 互为镜像二叉树
  • 右孩子 与 左孩子 互为镜像二叉树
/**
 * 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 isMirror(TreeNode* t1, TreeNode* t2) {
        if (!t1 && !t2) return true;
        if (!t1 || !t2) return false;
        
        return (t1->val == t2->val) && isMirror(t1->left, t2->right) && isMirror(t1->right, t2->left);
    }
    
    bool isSymmetric(TreeNode* root) {
        return isMirror(root, root);
    }
};

方法二:非递归

T:O(n) S:O(n)
两个指针从根节点出发,一个指针(根 左 右)的顺序进行遍历,一个指针(根 右 左)的顺序进行便来遍历。 看每个时刻指针指的是否是相同值得节点。
PS:不能先求出两个序列, 再比较两个序列是否相等。 先序遍历是不能唯一确定一颗二叉树的

/**
 * 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) {
        stack<TreeNode*> stk1, stk2;
        TreeNode *p1, *p2;
        p1 = p2 = root;
        while (p1 || !stk1.empty()) {
            while (p1) {
                if (!p2 || p1->val != p2->val) return false;  // 这里p1不可能为null, 所以还要检查p2是否为空,p2是null则返回false
                stk1.push(p1);
                stk2.push(p2);
                p1 = p1->left;  // p1一直往左遍历
                p2 = p2->right; // p2一直往右遍历
            }
            if (p2) return false;  // 这里p1是null, 所以检查p2是否为空, p2不空则返回false
            
            p1 = stk1.top(); stk1.pop();
            p1 = p1->right;
            p2 = stk2.top(); stk2.pop();
            p2 = p2->left;
        }
        
       return true; 
    }
};
发布了106 篇原创文章 · 获赞 113 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_41598072/article/details/104525589