// // main.cpp // subStructureInTree // // Created by Hugo Cao on 15/7/10. // Copyright (c) 2015年 Hugo Cao . All rights reserved. // /* 问题描述: 输入两个二叉树A和B,判断B树是否包含于A树。 查找B子树是否在A中, 思路:(1)首先寻找B根结点,是否在A中, (2)如果在,就查看是否A树包含B树 思考如何遍历A树寻找更结点,因为只有前序遍历可以最先找到根节点 */ #include <iostream> using namespace std; #define Data int typedef struct binaaryTreeNode { Data m_value; binaaryTreeNode *m_plift; binaaryTreeNode *m_pright; }btNode, *binTree; binTree addNode(Data value) { binTree bt = NULL; bt = new btNode; if (bt == NULL) { cout << "申请地址错误" << endl; return NULL; } bt->m_value = value; bt->m_plift = NULL; bt->m_pright = NULL; return bt; } bool connectTreeNode(binTree parrentNode, binTree leftSonNode = NULL, binTree rightSonNode = NULL) { if (parrentNode == NULL || (leftSonNode == NULL && rightSonNode == NULL)) { cout << "结点输入问题" << endl; return false; } parrentNode->m_plift = leftSonNode; parrentNode->m_pright = rightSonNode; return true; } binTree createBinaryATree(binTree Ahead) { binTree p1 = addNode(8); binTree p2 = addNode(8); binTree p3 = addNode(7); binTree p4 = addNode(9); binTree p5 = addNode(2); binTree p6 = addNode(4); binTree p7 = addNode(7); connectTreeNode(p1, p2, p3); connectTreeNode(p2, p4, p5); connectTreeNode(p5, p6, p7); return (Ahead = p1); } binTree createBinaryBTree(binTree Ahead) { binTree p1 = addNode(8); binTree p2 = addNode(9); binTree p3 = addNode(2); connectTreeNode(p1, p2, p3); return (Ahead = p1); } void RLR_print_BinaryTree(binTree bt) { if (bt == NULL) return ; cout << bt->m_value << " " << endl; RLR_print_BinaryTree(bt->m_plift); RLR_print_BinaryTree(bt->m_pright); } //判断是否为包含关系。 bool DoesTree1HaveTree2(binTree p1, binTree p2) { //树2为空是可以的, if (p2 == NULL) return true; //树2不为空,树1为空,就是证明1树没有包含2树 if (p1 == NULL) return false; //都不为空,判断值是否相同。不相同返回错误。 if (p1->m_value != p2->m_value) return false; //递归调用,保证左右子树都包含在A树中,才可以证明是A树包含B树。 return DoesTree1HaveTree2(p1->m_plift, p2->m_plift) && DoesTree1HaveTree2(p1->m_pright, p2->m_pright); } //判断是否是子树, 先寻找和B树相同的根结点。 bool findSubTree(binTree point1, binTree point2) { bool result = false; //这里递归调用point2,一直都没有改变,point1在不停的递归。 if (point1 != NULL && point2 != NULL) { //查找到了子B树根节点存在于要查找的A树中,开始进行比对 if (point1->m_value == point2->m_value) result = DoesTree1HaveTree2(point1, point1); //没有找到就继续寻找左子树 if (!result) result = findSubTree(point1->m_plift, point2); //没有找到就继续寻找右子树 if (!result) result = findSubTree(point1->m_pright, point2); } return result; } int main() { binTree bt_A = NULL; bt_A = createBinaryATree(bt_A); RLR_print_BinaryTree(bt_A); cout << endl; binTree bt_B = NULL; bt_B = createBinaryBTree(bt_B); RLR_print_BinaryTree(bt_B); cout << endl; if (true == findSubTree(bt_A, bt_B)) cout << "是子树" << endl; else{ cout << "不是子树" << endl; } return 0; }