目录
一、题目描述
二、初次解答
三、官方解法
四、总结
一、题目描述
二、初次解答
1. 思路:二叉树的先序遍历。采用递归的先序遍历方法,首先访问根节点若不同则返回false,其次访问左子树和右子树。在访问左右子树时,需要注意两种情况:①某棵树有左子树而另一棵树没有,则返回false。②某棵树有右子树而另一棵树没有,则返回false。在确定树形相同后,再判定它们对应的值是否相同。
2. 代码:
bool isSameTree(struct TreeNode* p, struct TreeNode* q) { //两棵树都为空 if(!p && !q) return true; //两棵树根节点一个空另一个非空 if((!p && q) || (p && !q)) return false; //两棵树根节点不同 if(p->val != q->val) return false; bool flag1=isSameTree(p->left, q->left); //访问左子树 bool flag2=isSameTree(p->right, q->right); //访问右子树 return flag1 && flag2; }
3. 优点:最多遍历一遍两棵树,时间复杂度为O(min{m,n})。
4. 缺点:采用了递归,空间复杂度为O(min{m,n})。
三、官方解法
官方解法一的方法与上述方法相同!官方解法二采用了广度优先搜索,需要手动维护两个队列,代码复杂且时间复杂度和空间复杂度与解法一相同,因此此处不展开讲解。
四、总结
判定两棵二叉树是否相同,可以将其转换为二叉树的遍历问题,从而使用简单的递归算法来求解。