二叉树的子结构
来源:互联网 发布:妆前乳 知乎 编辑:程序博客网 时间:2024/05/16 15:05
题目:输入两棵二叉树A和B,判断B是不是A的子结构。 解析:要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和树B根节点的值一样的节点R,第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。 第一步在树A中查找与根节点的值一样的节点,这实际上就是树的遍历。我们可以使用递归的方法遍历二叉树。代码如下:bool hasSubtree(BinaryTreeNode *root1,BinaryTreeNode *root2){bool result = false;if(root1 != NULL && root2 != NULL){if(root1->value == root2->value)result = doesTree1HaveTree2(root1,root2);if(!result)result = hasSubtree(root1->left,root2);if(!result)result = hasSubtree(root1->right,root2);}return result;}第二步是判断树A中以R为根节点的子树是不是和树B具有相同的结构。同样,我们也可以用递归的思想来考虑:如果结点R的值和树B的节点不同,则以R为根节点的子树和树B肯定不有相同的节点。如果他们的值相同,则递归的判断他们呢各自的左右节点的值是不是相同。递归的终止条件是我们达到了树A和树B的叶子节点。代码如下:bool DoesTree1HaveTree2(BinaryTreeNode *root1, BinaryTreeNode *root2){if (root2 == NULL)//如果root2为空,则说明到树B叶子节点为止都在树A中存在子树return true;if (root1 == NULL)//如果root1为空,则说明树A的某个子树是树B的子结构return false;if (root1->value != root2->value)return false;return DoesTree1HaveTree2(root1->left, root2->left)&& DoesTree1HaveTree2(root1->right, root2->right);}总代码如下:#include<iostream>using namespace std;struct BinaryTreeNode{BinaryTreeNode *left;BinaryTreeNode *right;char value;};void createTree(BinaryTreeNode* &root){char val;cin >> val;if (val != '@'){root = new BinaryTreeNode;root->value = val;root->left = NULL;root->right = NULL;createTree(root->left);createTree(root->right);}}void preOrder(BinaryTreeNode *root){if (root != NULL){cout << root->value << endl;preOrder(root->left);preOrder(root->right);}}bool DoesTree1HaveTree2(BinaryTreeNode *root1, BinaryTreeNode *root2){if (root2 == NULL)return true;if (root1 == NULL)return false;if (root1->value != root2->value)return false;return DoesTree1HaveTree2(root1->left, root2->left)&& DoesTree1HaveTree2(root1->right, root2->right);}bool HasSubtree(BinaryTreeNode *root1, BinaryTreeNode *root2){bool result = false;if (root1 != NULL && root2 != NULL){if (root1->value == root2->value)result = DoesTree1HaveTree2(root1, root2);if (!result)result = HasSubtree(root1->left, root2);if (!result)result = HasSubtree(root1->right, root2);}return result;}int main(void){BinaryTreeNode *root1 = NULL;BinaryTreeNode *root2 = NULL;createTree(root1);preOrder(root1);createTree(root2);preOrder(root2);if (HasSubtree(root1, root2)){cout << "yes" << endl;}else{cout << "no" << endl;}system("pause");return 0;}
0 0
- 二叉树的子结构
- 二叉树的子结构
- 二叉树的子结构
- 二叉树的子结构
- 二叉树的子结构
- 二叉树的子结构
- 二叉树的子结构
- 二叉树子结构
- 二叉树的子结构的判定
- 二叉树------树的子结构
- 树的子结构(二叉树)
- 二叉树23:树的子结构
- 判断二叉树的子结构
- 二叉树的子结构判断
- 20170928_二叉树的子结构
- 重构二叉树&&判断二叉树的子结构
- 【40】二叉树子结构
- 剑指offer-树的子结构 判断二叉树B是不是A的子结构
- iOS中的多态是什么?
- Android JSBridge的原理与实现
- 简单的圆角Dialog
- 士兵杀敌(一)
- iOS文件目录
- 二叉树的子结构
- slf4j--源码解析
- python 入门学习
- Android通知栏多条通知冲突的问题
- iOS开发中如何合理地制造BUG
- 2016寒假训练——搜索
- 修改灰色Bundle ID Bundle Identifier
- Unity for iOS 调用UIDatePicker
- Android View之--获取View大小时机