C++ 中判断两棵树是否同构
在二叉树中,每个节点包含两个子节点,即左子节点和右子节点。假设我们有两棵二叉树,任务是检查其中一棵树是否可以通过翻转另一棵树的左侧来获得。
如果一棵树可以通过翻转另一棵树的左侧来获得,则称这两棵树是同构的。
例如
输入-1
输出:同构
解释:给定的树-2可以通过翻转树-1的左侧获得,因此这两棵树是同构的。
解决此问题的方法
解决此特定问题的递归方法是,一个布尔函数将检查两棵树的根节点。如果两棵树的根节点都为空或为 NULL,则返回 True,并递归检查两个根节点的数据是否相同。然后,我们将递归检查树的左节点和右节点。
- 为两棵二叉树创建节点。
- 布尔函数 isIsomorphicTree(node*r1, node*r2) 获取两棵树的根节点,并返回树是否同构。
- 最初,如果树为空或没有任何节点,则返回 True。
- 如果根节点的子树没有翻转,并且如果两者都翻转,则返回 True。
示例
#include<bits/stdc++.h> using namespace std; struct treenode { int data; treenode * left; treenode * right; }; struct treenode * createNode(int d) { struct treenode * root = new treenode; root -> data = d; root -> left = NULL; root -> right = NULL; return root; } bool isIsomorphicTree(treenode * r1, treenode * r2) { if (r1 == NULL and r2 == NULL) { return true; } if (r1 == NULL or r2 == NULL) { return false; } return (r1 -> data == r2 -> data && ((isIsomorphicTree(r1 -> left, r2 -> right) && isIsomorphicTree(r1 -> right, r2 -> left)) || (isIsomorphicTree(r1 -> left, r2 -> left) && isIsomorphicTree(r1 -> right, r2 -> right)))); } int main() { struct treenode * r1 = createNode(1); r1 -> left = createNode(2); r1 -> right = createNode(3); r1 -> left -> left = createNode(4); r1 -> left -> right = createNode(5); r1 -> right -> left = createNode(6); r1 -> left -> right -> left = createNode(7); r1 -> left -> right -> right = createNode(8); struct treenode * r2 = createNode(1); r2 -> left = createNode(3); r2 -> right = createNode(2); r2 -> right -> left = createNode(4); r2 -> right -> right = createNode(5); r2 -> left -> right = createNode(6); r2 -> right -> right -> left = createNode(8); r2 -> right -> right -> right = createNode(7); if (isIsomorphicTree(r1, r2)) { cout << "Isomorphic" << endl; } else { cout << "Not an Isomorphic" << endl; } return 0; }
运行以上代码将生成以下输出:
输出
Isomorphic
解释:给定的树可以通过翻转另一棵树的左侧获得,因此它是同构的。
广告