题目:对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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;
}
};