LeetCode - 101. Symmetric Tree (C++)
2018-03-16 22:10
537 查看
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).For example, this binary tree
/ \
2 2
/ \ / \
3 4 4 3
But the following
1
/ \
2 2
\ \
3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
递归(recursive)版本:
/**
* 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) {
if (root == NULL) {
return true;
}
if (root->left == NULL && root->right == NULL) {
return true;
} else if (root->left == NULL || root->right == NULL) {
return false;
} else {
return isSymmetricCompare(root->left, root->right);
}
}
bool isSymmetricCompare(TreeNode* left, TreeNode* right) {
if (left->val != right->val) {
return false;
}
bool b1, b2;
if (left->left == NULL && right->right == NULL) {
b1 = true;
} else if(left->left == NULL || right->right == NULL) {
return false;
} else {
b1 = isSymmetricCompare(left->left, right->right);
}
if(left->right == NULL && right->left == NULL) {
b2 = true;
} else if (left->right == NULL || right->left == NULL) {
return false;
} else {
b2 = isSymmetricCompare(left->right, right->left);
}
return b1 && b2;
}
};
非递归(iteratively)版本:将左右子树放入栈中,每次pop出最上面的两棵树,如果这两棵树的根节点不同,那么直接返回false,否则如果这两棵树都有左右子树,那么则把第一棵树的左子树和第二棵树的右子树push到栈里,继续把第一棵树的右子树和第二颗树的左子树push到栈里;重复循环,直到栈内没有元素了。但是图中如果元素的个数为奇数则可以马上返回false,结束程序。(栈可以存NULL)
/**
* 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) {
if (root == NULL) {
return true;
}
stack<TreeNode*> stackTree;
//TreeNode leftNode(0);
//TreeNode rightNode(0);
TreeNode* left; //= &leftNode;
TreeNode* right;// = &rightNode;
if (root->left == NULL && root->right == NULL) {
return true;
} else if (root->left == NULL || root->right == NULL) {
return false;
} else {
stackTree.push(root->left);
stackTree.push(root->right);
while (!stackTree.empty()) {
right = stackTree.top();
stackTree.pop();
left = stackTree.top();
stackTree.pop();
if (left == NULL && right == NULL) {
continue;
} else if (left == NULL || right == NULL) {
return false;
} else {
if (right->val != left->val) {
return false;
}
stackTree.push(right->right);
stackTree.push(left->left);
stackTree.push(right->left);
stackTree.push(left->right);
}
}
return true;
}
}
};
[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
\ \
3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
递归(recursive)版本:
/**
* 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) {
if (root == NULL) {
return true;
}
if (root->left == NULL && root->right == NULL) {
return true;
} else if (root->left == NULL || root->right == NULL) {
return false;
} else {
return isSymmetricCompare(root->left, root->right);
}
}
bool isSymmetricCompare(TreeNode* left, TreeNode* right) {
if (left->val != right->val) {
return false;
}
bool b1, b2;
if (left->left == NULL && right->right == NULL) {
b1 = true;
} else if(left->left == NULL || right->right == NULL) {
return false;
} else {
b1 = isSymmetricCompare(left->left, right->right);
}
if(left->right == NULL && right->left == NULL) {
b2 = true;
} else if (left->right == NULL || right->left == NULL) {
return false;
} else {
b2 = isSymmetricCompare(left->right, right->left);
}
return b1 && b2;
}
};
非递归(iteratively)版本:将左右子树放入栈中,每次pop出最上面的两棵树,如果这两棵树的根节点不同,那么直接返回false,否则如果这两棵树都有左右子树,那么则把第一棵树的左子树和第二棵树的右子树push到栈里,继续把第一棵树的右子树和第二颗树的左子树push到栈里;重复循环,直到栈内没有元素了。但是图中如果元素的个数为奇数则可以马上返回false,结束程序。(栈可以存NULL)
/**
* 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) {
if (root == NULL) {
return true;
}
stack<TreeNode*> stackTree;
//TreeNode leftNode(0);
//TreeNode rightNode(0);
TreeNode* left; //= &leftNode;
TreeNode* right;// = &rightNode;
if (root->left == NULL && root->right == NULL) {
return true;
} else if (root->left == NULL || root->right == NULL) {
return false;
} else {
stackTree.push(root->left);
stackTree.push(root->right);
while (!stackTree.empty()) {
right = stackTree.top();
stackTree.pop();
left = stackTree.top();
stackTree.pop();
if (left == NULL && right == NULL) {
continue;
} else if (left == NULL || right == NULL) {
return false;
} else {
if (right->val != left->val) {
return false;
}
stackTree.push(right->right);
stackTree.push(left->left);
stackTree.push(right->left);
stackTree.push(left->right);
}
}
return true;
}
}
};
相关文章推荐
- Leetcode 101. Symmetric Tree( C++版)
- 【C++】【LeetCode】101. Symmetric Tree
- C++详解Leetcode:101. Symmetric Tree
- LeetCode解题报告 101. Symmetric Tree [easy]
- 【LeetCode】101. Symmetric Tree 中序遍历,分支遍历,二叉树
- 【leetcode】Binary Tree Right Side View --C++
- Balanced Binary Tree --Leetcode C++
- LeetCode刷题(C++)——Construct Binary Tree from Inorder and Postorder Traversal(Normal)
- Leetcode 101. Symmetric Tree
- LeetCode 101. Symmetric Tree
- leetcode之104. Maximum Depth of Binary Tree(C++解法)
- [LeetCode]101. Symmetric Tree
- [leetcode-145]Binary Tree Postorder Traversal(c++)
- LeetCode 101. Symmetric Tree
- leetcode_c++:树:Convert Sorted Array to Binary Search Tree(108)
- leetcode 144 Binary Tree Preorder Traversal C++
- [Leetcode] 101. Symmetric Tree 解题报告
- [leetcode] 101. Symmetric Tree
- [leetCode By Python]101. Symmetric Tree
- leetcode 101. Symmetric Tree(C语言,二叉树,递归,判对称性)30