15-- 输入两个二叉树A和B,判断B树是否包含于A树。

//
//  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;
}
原文地址:https://www.cnblogs.com/hgonlywj/p/4842563.html