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::queuequeue1, 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)。