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

剑指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 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则返回falsestk1.push(p1);stk2.push(p2);p1 = p1->left;  // p1一直往左遍历p2 = p2->right; // p2一直往右遍历}if (p2) return false;  // 这里p1是null, 所以检查p2是否为空, p2不空则返回falsep1 = stk1.top(); stk1.pop();p1 = p1->right;p2 = stk2.top(); stk2.pop();p2 = p2->left;}return true; }
};

 

更多相关:

  • 题目:从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 例如: 给定二叉树: [3,9,20,null,null,15,7],     3    /   9  20     /      15   7 返回其层次遍历结果: [   [3],   [9,20],   [...

  • 题目:二叉树的镜像 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入:      4    /      2     7  /   / 1   3 6   9 镜像输出:      4    /      7     2  /   / 9   6 3   1 示例 1: 输入:root =...

  • 题目:树的子结构 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A:      3     /    4   5   /  1   2 给定的树 B:    4    /  1 返回 true,因为 B...

  • 下面是树类型题目需要用到的头文件tree.h,请包含在cpp文件中编译,而不是放在c文件中编译,比如查找树中两个节点的最低公共父结点的题common_parent_in_tree.cpp,编译它的方法是: g++ -g common_parent_in_tree.cpp -o common_parent_in_tree 下...

  • 1 ==    (1)当对象是基本数据类型时,比较值;   (2)当对象是引用型时,比较的是地址值!!1 2 equals():只处理引用型数据;Object类中的equals方法依然比较的是地址值!   但在String,File,Date类重写了equals方法,比较的是值; 3 String类内存解析   Person p1=n...

  • 代码: % x = [-0.9, 0.81]; [y, L, B] = QCoeff(x, 3) % Unquantized parameters r = 0.9; theta = pi/3; a1 = -2*r*cos(theta); a2 = r*r; p1 = r*exp(j*theta); p2 = p1';% Quan...

  • 【描述】 公元19881231年,一颗巨大的陨石坠落在世界的政治文化中心cs。于是,灾难降临了,地球上出现了一系列反常的现象。当人们焦急万分的时候,一支由cs科学家组成的考察队赶到了出事地点。经过一番侦察,科学家们发现陨石上刻有若干行密文,每一行都包含5个整数:  1 1 1 1 6  0 0 6 3 57  8 0 11 3 284...

  • 点击打开链接   //求SUM(gcd(i,n), 1<=i<=n) /*g(n)=gcd(i,n),根据积性定义g(mn)=g(m)*g(n)(gcd(m,n)==1)所以gcd(i,n)是积性的,所以f(n)=sum(gcd(i,n))是积性的,f(n)=f(p1^a1*p2^a2*...*pn^an)=f(p1^a1)*f(p...