二叉树的子结构

来源:互联网 发布:妆前乳 知乎 编辑:程序博客网 时间: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
原创粉丝点击