题目描述
两个二叉树结构相同,且对应结点的值相同,我们称这两个二叉树等价.
例如:以下两个二叉树等价
1 1
/ \ / \
2 3 2 3
而以下两个则不等价
1 1
/ \ / \
2 3 3 2
以下两个也不等价
1 1
/ \ / \
2 3 2 2
给出两个二叉树p和q,判断它们是否等价.
p和q的结点数不多于100000,每个结点的数值在1和1000000000之间.
请为下面的Solution类实现解决上述问题的isEqual函数,函数的两个参数p和q分别代表两个二叉树的根节点,如果以p和q为根的二叉树等价则函数返回true,否则返回false.
/**
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 isEqual(TreeNode* p, TreeNode* q) {
}
};
注意:你只需要提交Solution类的代码,你在本地可以编写main函数测试程序,但不需要提交main函数的代码,也不需要提交TreeNode的定义. 注意不要修改类和函数的名称.
解题思路
递归。
两棵树之间的关系,分为下面五种情况:
- 都有左右子树,递归遍历两个子树
- 都只有左子树,递归遍历左子树
- 都只有右子树,递归遍历右子树
- 都为叶子节点,直接判定当前值是否相同
- 其他情况,则两棵树不等价
AC代码
// Problem#: 20618
// Submission#: 5142914
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
/**
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 isEqual(TreeNode* p, TreeNode* q) {
if (p->val != q->val)
return false;
if (p->left != NULL && p->right != NULL && q->left != NULL && q->right != NULL)
return isEqual(p->left, q->left) && isEqual(p->right, q->right);
else if (p->left != NULL && p->right == NULL && q->left != NULL && q->right == NULL)
return isEqual(p->left, q->left);
else if (p->left == NULL && p->right != NULL && q->left == NULL && q->right != NULL)
return isEqual(p->right, q->right);
else if (p->left == NULL && p->right == NULL && q->left == NULL && q->right == NULL)
return true;
else
return false;
}
};