题目:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
请写一个函数实现如下示例:
输入p[0,1,2],q=[0,1,2];输出true
输入p[0,1,2],q=[2,2,2];;输出false
输入p[1,2,null],q=[1,null,2];输出false
设定两棵二叉树上的节点数目范围为[0,1000],其值为int类型数据。
思路
1、二叉树相同,表示着其对应结构和值也是要完全相同的。
2、常见用于二叉树节点遍历的算法有深度优先搜索和广度优先搜索两种算法。
我们可以采用DFS(深度优先搜索),用递归的方法去判断二叉树是否相同。
我们分情况讨论:
(1)两个二叉树是都为空,返回true;
(2)两个二叉树是有且只有一个为空,返回false;
(3)两个二叉树是都不为空,判断他们根节点的值是否相同,否则返回false;
(4)在两个二叉树是都不为空且根节点值相同的情况下,再分别向下判断两个二叉树的左子树、右子树是否相同。这种判断是递归的工程,需采用递归函数实现。
解题代码如下:
/*构造一个二叉树数据结构体*/
struct B_TreeNode
{
int val;
struct B_TreeNode *left;
struct B_TreeNode *right;
};
/*写一个二叉树判断函数*/
bool isSameBinaryTree(struct B_TreeNode* p, struct B_TreeNode* q)
{
return (p == NULL && q == NULL)?true:(p == NULL || q == NULL)?false:(p->val != q->val)?false:(isSameBinaryTree(p->left,q->left) && isSameBinaryTree(p->right,q->right));
}
我们假设m、n分别为两个二叉数的节点数,那么该实现方法的时间复杂度为O(min(m,n)),由较小的二叉树节点数目决定;其空间复杂度也为O(min(m,n)),因为递归调用的次数是小于等于较小的二叉树最大高度的。