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.(给定两二叉树,判断它们是否相同。当两课二叉树的结构和节点值相同时被认为是相同的)
1.个人分析
直观的解法就是将两二叉树的每个节点进行比较,当任一节点的结构或节点值不同时就返回false。从根节点开始遍历,然后依次对左右子树作相同处理,本质上这就是二叉树的前序遍历。
2.个人解法
bool isSameTree(TreeNode* p, TreeNode* q)
{
if(p == NULL && q == NULL)
return true;
if((p == NULL && q != NULL) || (p != NULL && q == NULL) || (p != NULL && q !=NULL && p->val != q->val) )
return false;
isSameTree(p->left, q->left);
isSameTree(p->right, q->right);
return true;
}
结果显示,这种方法无法通过所有的测试用例,比如[10,5,15],[10,5,null,null,15]两棵二叉树,虽然节点数和节点值相同,但是两者的结构是完全不同的。
3.参考解法
bool isSameTree(TreeNode* p, TreeNode* q)
{
if(!p && !q)
return true;
if(!p || !q || p->val != q->val)
return false;
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
结果表示这种解法才能够返回正确的结果,差别仅在最后一条语句上面。
4.总结
自己的解法与参考解法的思路是一样,都是基于二叉树的前序遍历实现该算法,区别仅在于自己的解法只是应用了遍历一棵二叉树的方法,而这里是同时遍历两棵二叉树,应该同时判断每个节点的左右子节点是否相同,而不是分开判断左右子节点。
PS:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。