LeetCode 100. Same Tree
Given two binary trees, write a function to check if they are equal or not.
Two binary trees are considered equal if they are structurally identical and the nodes have the same value.
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == NULL && q == NULL)
return true;
if (p == NULL || q == NULL)
return false;
if (p->val == q->val)
{
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
return false;
}
};
写递归先写最底层,将最底层情况写出,然后再根据逻辑,写出上层到底层的传递方式。
----------------------------------------------------------------------------------------------------------------------------------------------------------
Leetcode 101. Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [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.
提示给出可以用递归和非递归两种方式,先用递归写。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
// TreeNode *cur = root;
if (root == NULL)
return true;
return isMirror(root->left, root->right);
}
bool isMirror(TreeNode *p, TreeNode *q)
{
if (q == NULL && p == NULL)
return true;
if (p == NULL || q == NULL)
return false;
if (p->val == q->val)
return isMirror(p->right, q->left) && isMirror(p->left, q->right);
return false;
}
};
在写递归过程中,由于必须分叉,因此增加了一个带2参数的函数来辅助判断。
对于非递归,将二叉树分成两半,则此时思路就是对于左半部分按照从左向右层序遍历;对于右半部分从右向左进行层序遍历。层序遍历采用队列结构,因此构造两个队列。
/**
* 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) {
TreeNode *lchild;
TreeNode *rchild;
queue<TreeNode *>p, q;
if (root == NULL)
{
return true;
}
p.push(root->left);
q.push(root->right);
while (!p.empty() && !q.empty())
{
lchild = p.front();
p.pop();
rchild = q.front();
q.pop();
if (lchild == NULL && rchild == NULL)
continue;
if (lchild == NULL || rchild == NULL)
return false;
if (lchild->val != rchild->val)
return false;
p.push(lchild->left);
p.push(lchild->right);
q.push(rchild->right);
q.push(rchild->left);
}
return true;
}
};
需要注意的是continue的使用,因为此时队列尚不为空,因此并不能直接return,需要继续判断直到队列为空。