面试题18:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下:
struct BinaryTreeNode { int val; BinaryTreeNode* left; BinaryTreeNode* right; };
例如下图中的两棵树,由于A中有一部分树的结构和B是一样的,因此B是A的子结构。
1 bool doesTree1HaveTree2(BinaryTreeNode* root1, BinaryTreeNode* root2) 2 {//判断root2是否为root1的前缀 3 if (root1 == NULL) 4 return false; 5 if (root2 == NULL) 6 return true; 7 if (root1->val!=root1->val) 8 return false; 9 return doesTree1HaveTree2(root1->left, root2->left) && doesTree1HaveTree2(root1->right, root2->right); 10 }
11 bool hasSubTree(BinaryTreeNode* root1, BinaryTreeNode* root2) 12 { 13 if (root1 == NULL) 14 return false; 15 if (root2 == NULL) 16 return true; 17 bool result = false; 18 if (root1->val == root2->val) 19 result = doesTree1HaveTree2(root1,root2); 20 if (!result) 21 result = hasSubTree(root1->left, root2) || hasSubTree(root1->right, root2); 22 return result; 23 }