剑指Offer----面试题18:树的子结构
来源:互联网 发布:做谱子的软件 编辑:程序博客网 时间:2024/05/22 16:06
题目:
输入两颗二叉树A和B,判断B是不是A的子结构。如下图:树B是树A的子结构。
方法一:
分析:要判断树B是否为树A的子结构,可以分为两步,第一步在树A中找到和树B的根节点的值一样的结点R,第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。
源代码如下:
#include"BinaryTree.h"#include<iostream>using std::cout;using std::endl;using namespace OrdinaryBinaryTreeSpace2;bool Total(BinaryTreeNode *root1, BinaryTreeNode *root2);bool HasSubTree(BinaryTreeNode *root1, BinaryTreeNode *root2);bool DoesTreeOneHaveTreeTwo(BinaryTreeNode *root1, BinaryTreeNode *root2);bool Total(BinaryTreeNode *root1, BinaryTreeNode *root2){if (root1 == NULL && root2 != NULL)return false;else if (root1 == NULL && root2 == NULL)return false;else if (root1 != NULL && root2 == NULL)return true;return HasSubTree(root1, root2);}bool HasSubTree(BinaryTreeNode *root1, BinaryTreeNode *root2){bool result = false;if (root1 != NULL && root2 != NULL){if (root1->element == root2->element)result = DoesTreeOneHaveTreeTwo(root1, root2);if (!result)result = HasSubTree(root1->left, root2);if (!result)result = HasSubTree(root1->right, root2);}return result;}bool DoesTreeOneHaveTreeTwo(BinaryTreeNode *root1, BinaryTreeNode *root2){if (root2 == NULL)return true;if (root1 == NULL)return false;if (root1->element != root2->element)return false;return DoesTreeOneHaveTreeTwo(root1->left, root2->left) && DoesTreeOneHaveTreeTwo(root1->right, root2->right);}void test11(){cout << "\t===========树A含有树B============" << endl;BinaryTreeNode *node1 = CreateBinaryTreeNode(8);BinaryTreeNode *node2 = CreateBinaryTreeNode(8);BinaryTreeNode *node3 = CreateBinaryTreeNode(7);BinaryTreeNode *node4 = CreateBinaryTreeNode(9);BinaryTreeNode *node5 = CreateBinaryTreeNode(2);BinaryTreeNode *node6 = CreateBinaryTreeNode(4);BinaryTreeNode *node7 = CreateBinaryTreeNode(7);ConnectBinaryTreeNodes(node1, node2, node3);ConnectBinaryTreeNodes(node2, node4, node5);ConnectBinaryTreeNodes(node3, NULL, NULL);ConnectBinaryTreeNodes(node4, NULL, NULL);ConnectBinaryTreeNodes(node5, node6, node7);ConnectBinaryTreeNodes(node6, NULL, NULL);ConnectBinaryTreeNodes(node7, NULL, NULL);BinaryTreeNode *node21 = CreateBinaryTreeNode(8);BinaryTreeNode *node22 = CreateBinaryTreeNode(9);BinaryTreeNode *node23 = CreateBinaryTreeNode(2);ConnectBinaryTreeNodes(node21, node22, node23);ConnectBinaryTreeNodes(node22, NULL, NULL);ConnectBinaryTreeNodes(node23, NULL, NULL);bool result = Total(node1, node21);if (result)cout << "Tree A contains tree B" << endl;elsecout << "Tree A not contains tree B" << endl;}void test12(){cout << "\t===========树A不含有树B============" << endl;BinaryTreeNode *node1 = CreateBinaryTreeNode(8);BinaryTreeNode *node2 = CreateBinaryTreeNode(8);BinaryTreeNode *node3 = CreateBinaryTreeNode(7);BinaryTreeNode *node4 = CreateBinaryTreeNode(9);BinaryTreeNode *node5 = CreateBinaryTreeNode(2);BinaryTreeNode *node6 = CreateBinaryTreeNode(4);BinaryTreeNode *node7 = CreateBinaryTreeNode(7);ConnectBinaryTreeNodes(node1, node2, node3);ConnectBinaryTreeNodes(node2, node4, node5);ConnectBinaryTreeNodes(node3, NULL, NULL);ConnectBinaryTreeNodes(node4, NULL, NULL);ConnectBinaryTreeNodes(node5, node6, node7);ConnectBinaryTreeNodes(node6, NULL, NULL);ConnectBinaryTreeNodes(node7, NULL, NULL);BinaryTreeNode *node21 = CreateBinaryTreeNode(8);BinaryTreeNode *node22 = CreateBinaryTreeNode(9);BinaryTreeNode *node23 = CreateBinaryTreeNode(3);ConnectBinaryTreeNodes(node21, node22, node23);ConnectBinaryTreeNodes(node22, NULL, NULL);ConnectBinaryTreeNodes(node23, NULL, NULL);bool result = Total(node1, node21);if (result)cout << "Tree A contains tree B" << endl;elsecout << "Tree A not contains tree B" << endl;}void test13(){cout << "\t===========树A非空,树B为空============" << endl;BinaryTreeNode *node1 = CreateBinaryTreeNode(8);BinaryTreeNode *node2 = CreateBinaryTreeNode(8);BinaryTreeNode *node3 = CreateBinaryTreeNode(7);BinaryTreeNode *node4 = CreateBinaryTreeNode(9);BinaryTreeNode *node5 = CreateBinaryTreeNode(2);BinaryTreeNode *node6 = CreateBinaryTreeNode(4);BinaryTreeNode *node7 = CreateBinaryTreeNode(7);ConnectBinaryTreeNodes(node1, node2, node3);ConnectBinaryTreeNodes(node2, node4, node5);ConnectBinaryTreeNodes(node3, NULL, NULL);ConnectBinaryTreeNodes(node4, NULL, NULL);ConnectBinaryTreeNodes(node5, node6, node7);ConnectBinaryTreeNodes(node6, NULL, NULL);ConnectBinaryTreeNodes(node7, NULL, NULL);bool result = Total(node1, NULL);if (result)cout << "Tree A contains tree B" << endl;elsecout << "Tree A not contains tree B" << endl;}void test14(){cout << "\t===========树A为空,树B非空============" << endl;BinaryTreeNode *node21 = CreateBinaryTreeNode(8);BinaryTreeNode *node22 = CreateBinaryTreeNode(9);BinaryTreeNode *node23 = CreateBinaryTreeNode(3);ConnectBinaryTreeNodes(node21, node22, node23);ConnectBinaryTreeNodes(node22, NULL, NULL);ConnectBinaryTreeNodes(node23, NULL, NULL);bool result = Total(NULL, node21);if (result)cout << "Tree A contains tree B" << endl;elsecout << "Tree A not contains tree B" << endl;}void test15(){cout << "\t===========树A树B都为空============" << endl;bool result = Total(NULL, NULL);if (result)cout << "Tree A contains tree B" << endl;elsecout << "Tree A not contains tree B" << endl;}int main(){test11();test12();test13();test14();test15();system("pause");return 0;}
运行结果:
===========树A含有树B============Tree A contains tree B ===========树A不含有树B============Tree A not contains tree B ===========树A非空,树B为空============Tree A contains tree B ===========树A为空,树B非空============Tree A not contains tree B ===========树A树B都为空============Tree A not contains tree B请按任意键继续. . .
官方源代码:
#include"BinaryTree.h"#include<cstdio>#include<cstdlib>using namespace OrdinaryBinaryTreeSpace2;bool HasSubtreeCore(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2);bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2);bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2){bool result = false;if (pRoot1 != NULL && pRoot2 != NULL){if (pRoot1->element == pRoot2->element)result = DoesTree1HaveTree2(pRoot1, pRoot2);if (!result)result = HasSubtree(pRoot1->left, pRoot2);if (!result)result = HasSubtree(pRoot1->right, pRoot2);}return result;}bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2){if (pRoot2 == NULL)return true;if (pRoot1 == NULL)return false;if (pRoot1->element != pRoot2->element)return false;return DoesTree1HaveTree2(pRoot1->left, pRoot2->left) &&DoesTree1HaveTree2(pRoot1->right, pRoot2->right);}// ====================测试代码====================void Test(char* testName, BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2, bool expected){if (HasSubtree(pRoot1, pRoot2) == expected)printf("%s passed.\n", testName);elseprintf("%s failed.\n", testName);}// 树中结点含有分叉,树B是树A的子结构// 8 8// / \ / \// 8 7 9 2// / \// 9 2// / \// 4 7void Test1(){BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(7);BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(2);BinaryTreeNode* pNodeA6 = CreateBinaryTreeNode(4);BinaryTreeNode* pNodeA7 = CreateBinaryTreeNode(7);ConnectBinaryTreeNodes(pNodeA1, pNodeA2, pNodeA3);ConnectBinaryTreeNodes(pNodeA2, pNodeA4, pNodeA5);ConnectBinaryTreeNodes(pNodeA5, pNodeA6, pNodeA7);BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2);ConnectBinaryTreeNodes(pNodeB1, pNodeB2, pNodeB3);Test("Test1", pNodeA1, pNodeB1, true);DestoryTree(pNodeA1);DestoryTree(pNodeB1);}// 树中结点含有分叉,树B不是树A的子结构// 8 8// / \ / \// 8 7 9 2// / \// 9 3// / \// 4 7void Test2(){BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(7);BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(3);BinaryTreeNode* pNodeA6 = CreateBinaryTreeNode(4);BinaryTreeNode* pNodeA7 = CreateBinaryTreeNode(7);ConnectBinaryTreeNodes(pNodeA1, pNodeA2, pNodeA3);ConnectBinaryTreeNodes(pNodeA2, pNodeA4, pNodeA5);ConnectBinaryTreeNodes(pNodeA5, pNodeA6, pNodeA7);BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2);ConnectBinaryTreeNodes(pNodeB1, pNodeB2, pNodeB3);Test("Test2", pNodeA1, pNodeB1, false);DestoryTree(pNodeA1);DestoryTree(pNodeB1);}// 树中结点只有左子结点,树B是树A的子结构// 8 8// / / // 8 9 // / /// 9 2// / // 2 // /// 5void Test3(){BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2);BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(5);ConnectBinaryTreeNodes(pNodeA1, pNodeA2, NULL);ConnectBinaryTreeNodes(pNodeA2, pNodeA3, NULL);ConnectBinaryTreeNodes(pNodeA3, pNodeA4, NULL);ConnectBinaryTreeNodes(pNodeA4, pNodeA5, NULL);BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2);ConnectBinaryTreeNodes(pNodeB1, pNodeB2, NULL);ConnectBinaryTreeNodes(pNodeB2, pNodeB3, NULL);Test("Test3", pNodeA1, pNodeB1, true);DestoryTree(pNodeA1);DestoryTree(pNodeB1);}// 树中结点只有左子结点,树B不是树A的子结构// 8 8// / / // 8 9 // / /// 9 3// / // 2 // /// 5void Test4(){BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2);BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(5);ConnectBinaryTreeNodes(pNodeA1, pNodeA2, NULL);ConnectBinaryTreeNodes(pNodeA2, pNodeA3, NULL);ConnectBinaryTreeNodes(pNodeA3, pNodeA4, NULL);ConnectBinaryTreeNodes(pNodeA4, pNodeA5, NULL);BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(3);ConnectBinaryTreeNodes(pNodeB1, pNodeB2, NULL);ConnectBinaryTreeNodes(pNodeB2, pNodeB3, NULL);Test("Test4", pNodeA1, pNodeB1, false);DestoryTree(pNodeA1);DestoryTree(pNodeB1);}// 树中结点只有右子结点,树B是树A的子结构// 8 8// \ \ // 8 9 // \ \// 9 2// \ // 2 // \// 5void Test5(){BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2);BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(5);ConnectBinaryTreeNodes(pNodeA1, NULL, pNodeA2);ConnectBinaryTreeNodes(pNodeA2, NULL, pNodeA3);ConnectBinaryTreeNodes(pNodeA3, NULL, pNodeA4);ConnectBinaryTreeNodes(pNodeA4, NULL, pNodeA5);BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2);ConnectBinaryTreeNodes(pNodeB1, NULL, pNodeB2);ConnectBinaryTreeNodes(pNodeB2, NULL, pNodeB3);Test("Test5", pNodeA1, pNodeB1, true);DestoryTree(pNodeA1);DestoryTree(pNodeB1);}// 树A中结点只有右子结点,树B不是树A的子结构// 8 8// \ \ // 8 9 // \ / \// 9 3 2// \ // 2 // \// 5void Test6(){BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2);BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(5);ConnectBinaryTreeNodes(pNodeA1, NULL, pNodeA2);ConnectBinaryTreeNodes(pNodeA2, NULL, pNodeA3);ConnectBinaryTreeNodes(pNodeA3, NULL, pNodeA4);ConnectBinaryTreeNodes(pNodeA4, NULL, pNodeA5);BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(3);BinaryTreeNode* pNodeB4 = CreateBinaryTreeNode(2);ConnectBinaryTreeNodes(pNodeB1, NULL, pNodeB2);ConnectBinaryTreeNodes(pNodeB2, pNodeB3, pNodeB4);Test("Test6", pNodeA1, pNodeB1, false);DestoryTree(pNodeA1);DestoryTree(pNodeB1);}// 树A为空树void Test7(){BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(3);BinaryTreeNode* pNodeB4 = CreateBinaryTreeNode(2);ConnectBinaryTreeNodes(pNodeB1, NULL, pNodeB2);ConnectBinaryTreeNodes(pNodeB2, pNodeB3, pNodeB4);Test("Test7", NULL, pNodeB1, false);DestoryTree(pNodeB1);}// 树B为空树void Test8(){BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8);BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(9);BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(3);BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(2);ConnectBinaryTreeNodes(pNodeA1, NULL, pNodeA2);ConnectBinaryTreeNodes(pNodeA2, pNodeA3, pNodeA4);Test("Test8", pNodeA1, NULL, false);DestoryTree(pNodeA1);}// 树A和树B都为空void Test9(){Test("Test9", NULL, NULL, false);}int main(){Test1();Test2();Test3();Test4();Test5();Test6();Test7();Test8();Test9();system("pause");return 0;}
运行结果:
Test1 passed.Test2 passed.Test3 passed.Test4 passed.Test5 passed.Test6 passed.Test7 passed.Test8 passed.Test9 passed.请按任意键继续. . .
0 0
- [剑指offer][面试题18]树的子结构
- 【剑指offer】面试题18:树的子结构
- 剑指offer 面试题18 树的子结构
- 剑指Offer:面试题18 树的子结构
- 《剑指Offer》面试题18:树的子结构
- 剑指offer 面试题18—树的子结构
- 【剑指Offer学习】【面试题18 :树的子结构】
- 剑指offer面试题18-树的子结构
- 剑指offer-面试题18:树的子结构
- 剑指offer之面试题18:树的子结构
- 剑指offer之面试题18树的子结构
- 剑指Offer----面试题18:树的子结构
- 剑指offer-面试题18:树的子结构
- 剑指offer面试题18:树的子结构
- 剑指offer面试题18:树的子结构
- 剑指offer面试题18:树的子结构
- 剑指offer--面试题18:树的子结构
- 剑指Offer---面试题18:树的子结构
- OtoStudio学习笔记2(基础编程&矩形控制例子&曲线图绘制)
- 实例069-判断文件类型
- myeclipse部署时An internal error occurred 错误的几种情况
- ava.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getPaddi
- 使用行为树(Behavior Tree)实现游戏AI
- 剑指Offer----面试题18:树的子结构
- 欢迎使用CSDN-markdown编辑器
- Fragment实现Tab
- 快速搭建一个简单的spring+maven工程
- python中的关键字yield和迭代器的使用
- PAT L2-011.玩转二叉树(数据结构,二叉链表)
- (4.6.13)StrictMode严苛模式协助程序开发查错
- 基于Linux的网络编程
- 如何定位和解决Andorid的内存溢出问题(大总结)