18. 树的子结构(代码流程还没走完)

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

  思路:在二叉树A中遍历寻找B的根节点,如果找到,则继续比较左右子树结点。

  测试用例
  1.功能测试:B是或不是A的子结构
  2.特殊测试:NULL

#include<iostream>
#include<cstdio>
using namespace std;

struct BinaryTreeNode
{
    int                 m_nValue;
    BinaryTreeNode*     m_pLeft;
    BinaryTreeNode*     m_pRight;
};

//创建树结点
BinaryTreeNode* CreateNode(int value)
{
    BinaryTreeNode* TreeNode = new BinaryTreeNode();
    TreeNode->m_nValue = value;
    TreeNode->m_pLeft = NULL;
    TreeNode->m_pRight = NULL;

    return TreeNode;
}

//连接树结点
void ConnectTreeNodes(BinaryTreeNode* pRoot, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
{
    if (pRoot == NULL)
    {
        return;
    }

    pRoot->m_pLeft = pLeft;
    pRoot->m_pRight = pRight;
}

//销毁树
void DestroyTree(BinaryTreeNode* pRoot)
{
    if (pRoot != NULL)
    {
        delete pRoot;
        pRoot = NULL;

        DestroyTree(pRoot->m_pLeft);
        DestroyTree(pRoot->m_pRight);
    }
}

bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
    if (pRoot2 == NULL)
    {
        return true;
    }

    if (pRoot1 == NULL)
    {
        return false;
    }

    if (pRoot1->m_nValue != pRoot2->m_nValue)
    {
        return false;
    }

    return DoesTree1HaveTree2(pRoot1->m_pLeft, pRoot2->m_pLeft) &&
                 DoesTree1HaveTree2(pRoot1->m_pRight, pRoot2->m_pRight);
}

bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
    bool result = false;

    if (pRoot1 != NULL && pRoot2 != NULL)
    {
        if (pRoot1->m_nValue == pRoot2->m_nValue)
        {
            result = DoesTree1HaveTree2(pRoot1, pRoot2);
        }

        if (!result)
        {
            result = HasSubtree(pRoot1->m_pLeft, pRoot2);
        }

        if (!result)
        {
            result = HasSubtree(pRoot1->m_pRight, pRoot2);
        }
    }

    return result;
}

void test1()
{
    BinaryTreeNode* node1 = CreateNode(8);
    BinaryTreeNode* node2 = CreateNode(8);
    BinaryTreeNode* node3 = CreateNode(7);
    BinaryTreeNode* node4 = CreateNode(9);
    BinaryTreeNode* node5 = CreateNode(2);

    ConnectTreeNodes(node1, node2, node3);
    ConnectTreeNodes(node2, node4, node5);

    BinaryTreeNode* node6 = CreateNode(8);
    BinaryTreeNode* node7 = CreateNode(9);
    BinaryTreeNode* node8 = CreateNode(2);

    ConnectTreeNodes(node6, node7, node8);

    bool result = HasSubtree(node1, node6);
    if (result)
    {
        cout << "成功!" << endl;
    }

}

int main()
{
    test1();

    return 0;
}

猜你喜欢

转载自my.oschina.net/134596/blog/1796516
18.