剑指offer_面试题18_树的子结构
来源:互联网 发布:掉头发 白头发 知乎 编辑:程序博客网 时间:2024/05/17 02:13
题目:输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。
两个步骤:
1、第一步在树 A 中找到和树 B 的根结点的值一样的结点 R
2、第二步再判断树 A 中以 R 为根结点的子树是不是包含和树 B 一样的结构。
对于递归:想好判断条件,以及 什么条件下该去递归。
#include <iostream>#include <cstdlib>using namespace std;typedef struct node{ int m_pValue; struct node *lchild; struct node *rchild;}TreeNode;/**创建一个二叉树结点*/TreeNode * create_Treenode(int elem){ TreeNode *pRoot; pRoot = new TreeNode; pRoot->m_pValue = elem; pRoot->lchild = NULL; pRoot->rchild = NULL; return pRoot;}/**将二叉树结点连接起来,组成一颗二叉树*/TreeNode * connect_Treenode(TreeNode *pRoot, TreeNode *p_lchild, TreeNode *p_rchild){ if(NULL == pRoot) return pRoot; pRoot->lchild = p_lchild; pRoot->rchild = p_rchild; return pRoot;}//TreeNode * delete_node()/**在根结点找到的情况下,判断树1中是否存在树2的结构*/bool Does_tree1_have_tree2(TreeNode *pRoot1,TreeNode *pRoot2){ if(pRoot2 == NULL) /**在找的过程中,如果树2遍历到了叶节点,说明前面的节点都相同*/ return true; if(pRoot1 == NULL) /**树1遍历到叶结点,说明找不到树2中的结点*/ return false; if(pRoot1->m_pValue != pRoot2->m_pValue) return false; return Does_tree1_have_tree2(pRoot1->lchild,pRoot2->lchild) && Does_tree1_have_tree2(pRoot1->rchild,pRoot2->rchild);}/**感觉写递归,就是想好一步应该判断的条件,什么情况下返回*//**找根结点*/bool Hassubtree(TreeNode *pRoot1,TreeNode *pRoot2){ bool result = false; if(pRoot1 != NULL && pRoot2 != NULL) { if(pRoot1->m_pValue == pRoot2->m_pValue) result = Does_tree1_have_tree2(pRoot1,pRoot2); if(!result) /**如果根结点不是,那先去找左孩子*/ result = Hassubtree(pRoot1->lchild,pRoot2); if(!result) /**如果左孩子还不是,那去找右孩子*/ result = Hassubtree(pRoot1->rchild,pRoot2); } return result;}/**测试函数,来源于书本,学习了这种测试函数写法,很有收获*/void Test(const char* testName, TreeNode* pRoot1, TreeNode* pRoot2, bool expected) /**此处 testName 前应该加 const*/{ if(Hassubtree(pRoot1, pRoot2) == expected) cout << testName << " passed." << endl; else cout << testName << " failed." << endl;}/** 树中结点含有分叉,树B是树A的子结构 *//** 8 8 *//** / \ / \ *//** 8 7 9 2 *//** / \ *//** 9 2 *//** / \ *//** 4 7 */void Test1(){ TreeNode* pNodeA1 = create_Treenode(8); TreeNode* pNodeA2 = create_Treenode(8); TreeNode* pNodeA3 = create_Treenode(7); TreeNode* pNodeA4 = create_Treenode(9); TreeNode* pNodeA5 = create_Treenode(2); TreeNode* pNodeA6 = create_Treenode(4); TreeNode* pNodeA7 = create_Treenode(7); connect_Treenode(pNodeA1, pNodeA2, pNodeA3); connect_Treenode(pNodeA2, pNodeA4, pNodeA5); connect_Treenode(pNodeA5, pNodeA6, pNodeA7); TreeNode* pNodeB1 = create_Treenode(8); TreeNode* pNodeB2 = create_Treenode(9); TreeNode* pNodeB3 = create_Treenode(2); connect_Treenode(pNodeB1, pNodeB2, pNodeB3); Test("Test1", pNodeA1, pNodeB1, true); //DestroyTree(pNodeA1); //DestroyTree(pNodeB1);}/** 树中结点含有分叉,树B不是树A的子结构*//** 8 8 *//** / \ / \ *//** 8 7 9 2 *//** / \ *//** 9 3 *//** / \ *//** 4 7 */void Test2(){ TreeNode* pNodeA1 = create_Treenode(8); TreeNode* pNodeA2 = create_Treenode(8); TreeNode* pNodeA3 = create_Treenode(7); TreeNode* pNodeA4 = create_Treenode(9); TreeNode* pNodeA5 = create_Treenode(3); TreeNode* pNodeA6 = create_Treenode(4); TreeNode* pNodeA7 = create_Treenode(7); connect_Treenode(pNodeA1, pNodeA2, pNodeA3); connect_Treenode(pNodeA2, pNodeA4, pNodeA5); connect_Treenode(pNodeA5, pNodeA6, pNodeA7); TreeNode* pNodeB1 = create_Treenode(8); TreeNode* pNodeB2 = create_Treenode(9); TreeNode* pNodeB3 = create_Treenode(2); connect_Treenode(pNodeB1, pNodeB2, pNodeB3); Test("Test2", pNodeA1, pNodeB1, false); //DestroyTree(pNodeA1); //DestroyTree(pNodeB1);}// 树中结点只有左子结点,树B是树A的子结构// 8 8// / /// 8 9// / /// 9 2// /// 2// /// 5void Test3(){ TreeNode* pNodeA1 = create_Treenode(8); TreeNode* pNodeA2 = create_Treenode(8); TreeNode* pNodeA3 = create_Treenode(9); TreeNode* pNodeA4 = create_Treenode(2); TreeNode* pNodeA5 = create_Treenode(5); connect_Treenode(pNodeA1, pNodeA2, NULL); connect_Treenode(pNodeA2, pNodeA3, NULL); connect_Treenode(pNodeA3, pNodeA4, NULL); connect_Treenode(pNodeA4, pNodeA5, NULL); TreeNode* pNodeB1 = create_Treenode(8); TreeNode* pNodeB2 = create_Treenode(9); TreeNode* pNodeB3 = create_Treenode(2); connect_Treenode(pNodeB1, pNodeB2, NULL); connect_Treenode(pNodeB2, pNodeB3, NULL); Test("Test3", pNodeA1, pNodeB1, true); //DestroyTree(pNodeA1); //DestroyTree(pNodeB1);}// 树中结点只有左子结点,树B不是树A的子结构// 8 8// / /// 8 9// / /// 9 3// /// 2// /// 5void Test4(){ TreeNode* pNodeA1 = create_Treenode(8); TreeNode* pNodeA2 = create_Treenode(8); TreeNode* pNodeA3 = create_Treenode(9); TreeNode* pNodeA4 = create_Treenode(2); TreeNode* pNodeA5 = create_Treenode(5); connect_Treenode(pNodeA1, pNodeA2, NULL); connect_Treenode(pNodeA2, pNodeA3, NULL); connect_Treenode(pNodeA3, pNodeA4, NULL); connect_Treenode(pNodeA4, pNodeA5, NULL); TreeNode* pNodeB1 = create_Treenode(8); TreeNode* pNodeB2 = create_Treenode(9); TreeNode* pNodeB3 = create_Treenode(3); connect_Treenode(pNodeB1, pNodeB2, NULL); connect_Treenode(pNodeB2, pNodeB3, NULL); Test("Test4", pNodeA1, pNodeB1, false); //DestroyTree(pNodeA1); //DestroyTree(pNodeB1);}// 树中结点只有右子结点,树B是树A的子结构// 8 8// \ \// 8 9// \ \// 9 2// \// 2// \// 5void Test5(){ TreeNode* pNodeA1 = create_Treenode(8); TreeNode* pNodeA2 = create_Treenode(8); TreeNode* pNodeA3 = create_Treenode(9); TreeNode* pNodeA4 = create_Treenode(2); TreeNode* pNodeA5 = create_Treenode(5); connect_Treenode(pNodeA1, NULL, pNodeA2); connect_Treenode(pNodeA2, NULL, pNodeA3); connect_Treenode(pNodeA3, NULL, pNodeA4); connect_Treenode(pNodeA4, NULL, pNodeA5); TreeNode* pNodeB1 = create_Treenode(8); TreeNode* pNodeB2 = create_Treenode(9); TreeNode* pNodeB3 = create_Treenode(2); connect_Treenode(pNodeB1, NULL, pNodeB2); connect_Treenode(pNodeB2, NULL, pNodeB3); Test("Test5", pNodeA1, pNodeB1, true); //DestroyTree(pNodeA1); //DestroyTree(pNodeB1);}// 树A中结点只有右子结点,树B不是树A的子结构// 8 8// \ \// 8 9// \ / \// 9 3 2// \// 2// \// 5void Test6(){ TreeNode* pNodeA1 = create_Treenode(8); TreeNode* pNodeA2 = create_Treenode(8); TreeNode* pNodeA3 = create_Treenode(9); TreeNode* pNodeA4 = create_Treenode(2); TreeNode* pNodeA5 = create_Treenode(5); connect_Treenode(pNodeA1, NULL, pNodeA2); connect_Treenode(pNodeA2, NULL, pNodeA3); connect_Treenode(pNodeA3, NULL, pNodeA4); connect_Treenode(pNodeA4, NULL, pNodeA5); TreeNode* pNodeB1 = create_Treenode(8); TreeNode* pNodeB2 = create_Treenode(9); TreeNode* pNodeB3 = create_Treenode(3); TreeNode* pNodeB4 = create_Treenode(2); connect_Treenode(pNodeB1, NULL, pNodeB2); connect_Treenode(pNodeB2, pNodeB3, pNodeB4); Test("Test6", pNodeA1, pNodeB1, false); //DestroyTree(pNodeA1); //DestroyTree(pNodeB1);}// 树A为空树void Test7(){ TreeNode* pNodeB1 = create_Treenode(8); TreeNode* pNodeB2 = create_Treenode(9); TreeNode* pNodeB3 = create_Treenode(3); TreeNode* pNodeB4 = create_Treenode(2); connect_Treenode(pNodeB1, NULL, pNodeB2); connect_Treenode(pNodeB2, pNodeB3, pNodeB4); Test("Test7", NULL, pNodeB1, false); //DestroyTree(pNodeB1);}// 树B为空树void Test8(){ TreeNode* pNodeA1 = create_Treenode(8); TreeNode* pNodeA2 = create_Treenode(9); TreeNode* pNodeA3 = create_Treenode(3); TreeNode* pNodeA4 = create_Treenode(2); connect_Treenode(pNodeA1, NULL, pNodeA2); connect_Treenode(pNodeA2, pNodeA3, pNodeA4); Test("Test8", pNodeA1, NULL, false); //DestroyTree(pNodeA1);}// 树A和树B都为空void Test9(){ Test("Test9", NULL, NULL, false);}int main(){ Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); Test7(); Test8(); Test9(); return 0;}
/*点滴积累,我的一小步O(∩_∩)O~*/
0 0
- 剑指offer_面试题18_树的子结构
- 剑指Offer_面试题18_树的子结构
- Iava 剑指offer_面试题18_树的子结构
- 剑指Offer_面试题31_连续子数组的最大和
- 剑指Offer_面试题11_数值的整数次方
- 剑指Offer_面试题28_字符串的排列
- 剑指Offer_面试题30_最小的k个数
- 剑指Offer_面试题06_重建二叉树
- 剑指Offer_面试题16_逆置链表
- 剑指Offer_面试题39_二叉树的深度 & 判断平衡二叉树
- 剑指offer_面试题19_二叉树的镜像
- 剑指offer_面试题24_二叉搜索树的后序遍历序列(递归)
- 剑指offer_面试题25_二叉树中和为某一值的路径
- Java 剑指offer_面试题19_二叉树的镜像
- 剑指Offer_面试题24_二叉搜索树的后序遍历序列
- 剑指Offer_面试题25_二叉树中和为某一值的路径
- 剑指Offer_面试题28.5_字符串的排列扩展_排列组合_八皇后问题
- 面试题18:树的子结构
- QTranslator的使用
- hdu 5389 Zero Escape 2015多校联合训练赛#8 动态规划
- 贝叶斯公式,全概率公式
- ExecuteInEditMode加在类前面即是没有运行也能产生效果
- iOS百度地图SDK常见问题以及解决方案
- 剑指offer_面试题18_树的子结构
- 一些常用的batch命令
- android大牛博客收集贴
- 字符串指针变量与字符数组的区别
- Android编译环境配置
- 瑶瑶宝贝
- python回调函数的使用方法
- python继承
- 创建型模式之单例模式