【编程题目】Pq.11--树的子结构

来源:互联网 发布:宜信大数据 待遇 编辑:程序博客网 时间:2024/06/05 08:59

一、题目描述

输入两棵二叉树A和B,判断B是不是A的子结构。

二、实现

      思路非常简单,只需要遍历树A,首先查找和B根节点相同的节点,再判断B是不是A的子结构即可。树的操作同样涉及大量的指针,需要检查并作相应处理。

struct BinaryTreeNode{    int m_nValue;    BinaryTreeNode* m_pLeft;    BinaryTreeNode* m_pRight;};bool DoesTreeAHaveTreeB(BinaryTreeNode* pRootA, BinaryTreeNode* pRootB){    /*递归终止条件:到达任一树的叶子节点*/    if (pRootA == NULL)        return true;    if (pRootB == NULL)        return true;    /*根节点不同*/    if (pRootA->m_nValue != pRootB->m_nValue)        return false;    /*递归判断左右两个节点是否相同*/    return DoesTreeAHaveTreeB(pRootA->m_pLeft, pRootB->m_pLeft) &&        DoesTreeAHaveTreeB(pRootA->m_pRight, pRootB->m_pRight);}bool HasSubtree(BinaryTreeNode* pRootA, BinaryTreeNode* pRootB){    bool result = false;    if (pRootA != NULL&&pRootB != NULL)    {        /*根节点相同,则判断左右子节点是否相同*/        if (pRootA->m_nValue == pRootB->m_nValue)            result = DoesTreeAHaveTreeB(pRootA, pRootB);        /*继续遍历树A*/        if (!result)            result = HasSubtree(pRootA->m_pLeft, pRootB);        if (!result)            result = HasSubtree(pRootA->m_pRight, pRootB);    }    return result;}
0 0