剑指 Offer 28. 对称的二叉树 - 力扣(LeetCode) (leetcode-cn.com)
目录
递归
运行结果
代码
class Solution {
typedef TreeNode* tree;
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return is_symmetric(root->left, root->right);
}
bool is_symmetric(tree Ltree, tree Rtree) {
if (!Ltree && !Rtree) return true;
if ((!Ltree && Rtree) || (Ltree && !Rtree)) return false;
if (Ltree->val != Rtree->val) return false;
return is_symmetric(Ltree->left, Rtree->right) && is_symmetric(Ltree->right, Rtree->left);
}
};
非递归中序
运行结果
代码
class Solution {
#define scale 0x1000
typedef TreeNode* tree;
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
tree stk[scale]; int sp = 0;
tree Ltree = root->left, Rtree = root->right;
while (Ltree || Rtree || sp) {
while (Ltree && Rtree) {
stk[sp++] = Ltree; stk[sp++] = Rtree;
Ltree = Ltree->left; Rtree = Rtree->right;
}
if (Ltree || Rtree) return false;
if (sp) {
Rtree = stk[--sp]; Ltree = stk[--sp];
if (Ltree->val != Rtree->val) return false;
Ltree = Ltree->right; Rtree = Rtree->left;
}
}
return true;
}
};
非递归先序
运行结果
代码
class Solution {
#define scale 0x22
typedef TreeNode* tree;
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
tree stk[scale]; int sp = 0;
tree Ltree = root->left, Rtree = root->right;
while (Ltree || Rtree || sp) {
while (Ltree && Rtree) {
if (Ltree->val != Rtree->val) return false;
stk[sp++] = Ltree; stk[sp++] = Rtree;
Ltree = Ltree->left; Rtree = Rtree->right;
}
if (Ltree || Rtree) return false;
if (sp) {
Rtree = stk[--sp]; Ltree = stk[--sp];
Ltree = Ltree->right; Rtree = Rtree->left;
}
}
return true;
}
};
非递归后序
运行结果
代码
class Solution {
#define scale 0x2A
typedef TreeNode* tree;
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
tree Ltree = root->left, Rtree = root->right;
tree stk[scale]; int sp = 0;
bool otherside_unprocessed[scale]; int buoy = 0;
while (Ltree || Rtree || sp) {
while (Ltree && Rtree) {
stk[sp] = Ltree; stk[sp + 1] = Rtree; sp += 2;
otherside_unprocessed[buoy++] = 1;
Ltree = Ltree->left; Rtree = Rtree->right;
}
if (Ltree || Rtree) return false;
while (sp) {
Rtree = stk[sp - 1]; Ltree = stk[sp - 2];
if (otherside_unprocessed[buoy - 1]) {
otherside_unprocessed[buoy - 1] = 0;
Ltree = Ltree->right; Rtree = Rtree->left;
break;
}
if (Ltree->val != Rtree->val) return false;
Ltree = Rtree = NULL;
sp -= 2; --buoy;
}
}
return true;
}
};