当前位置:实例文章 » 其他实例» [文章]C++判断两棵树是否为相同的树

C++判断两棵树是否为相同的树

发布人:shili8 发布时间:2025-01-25 04:57 阅读次数:0

**判断两棵树是否为相同的树**

在计算机科学中,树是一种常见的数据结构,它由结点组成,每个结点都有零个或多个子结点。判断两棵树是否为相同的树是一个重要的问题,这涉及到比较两个树的结构和内容。

**定义**

我们可以将一个树定义为以下结构:

cppstruct TreeNode {
 int val;
 TreeNode *left;
 TreeNode *right;
};


其中,`val`是结点的值,`left`和`right`分别指向左子树和右子树。

**方法一:递归法**

我们可以使用递归法来比较两个树。这个方法的基本思想是,如果两个树的结构相同,则它们的内容也应该相同。

cppbool isSameTree(TreeNode *p, TreeNode *q) {
 // 如果两个树都为空,返回 true if (p == nullptr && q == nullptr)
 return true;
 // 如果一个树为空,而另一个树不为空,返回 false if (p == nullptr || q == nullptr)
 return false;
 // 如果两个树的值相同,则继续比较左子树和右子树 if (p->val == q->val) {
 return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
 }
 // 如果两个树的值不同,返回 false return false;
}


这个方法的时间复杂度是 O(n),其中 n 是树的结点数,因为我们需要访问每个结点一次。

**方法二:迭代法**

我们也可以使用迭代法来比较两个树。这个方法的基本思想是,使用一个队列来存储结点,并且在每次迭代中比较当前结点和下一个结点。

cppbool isSameTree(TreeNode *p, TreeNode *q) {
 if (p == nullptr && q == nullptr)
 return true;
 if (p == nullptr || q == nullptr)
 return false;
 std::queue queue1, queue2;
 queue1.push(p);
 queue2.push(q);
 while (!queue1.empty()) {
 TreeNode *node1 = queue1.front();
 TreeNode *node2 = queue2.front();
 if (node1->val != node2->val)
 return false;
 queue1.pop();
 queue2.pop();
 if (node1->left && node2->left) {
 queue1.push(node1->left);
 queue2.push(node2->left);
 } else if (node1->left || node2->left) {
 return false;
 }
 if (node1->right && node2->right) {
 queue1.push(node1->right);
 queue2.push(node2->right);
 } else if (node1->right || node2->right) {
 return false;
 }
 }
 return true;
}


这个方法的时间复杂度也是 O(n),因为我们需要访问每个结点一次。

**总结**

在本文中,我们讨论了如何判断两棵树是否为相同的树。我们提供了两个方法:递归法和迭代法。这些方法都可以用来比较两个树的结构和内容,并且它们的时间复杂度都是 O(n)。

其他信息

其他资源

Top