/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
/*
Q:
树的子结构:
输入两颗二叉树A和B,判断B是不是A的子结构
S:
首先在树A中找到跟B根节点值相同的结点;判断A中以该节点为根节点的
子树是不是跟B一样的结构。
*/
#include "../utils/BinaryTree.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
bool doeeTreeHasTree2(BinaryTreeNode*pRootA, BinaryTreeNode*pRootB)
{
if(pRootB == nullptr)
return true;
if(pRootA == nullptr)
return false;
if(pRootA->m_nValue != pRootB->m_nValue)
return false;
return (doeeTreeHasTree2(pRootA->m_pLeft, pRootB->m_pLeft) &&
doeeTreeHasTree2(pRootA->m_pRight, pRootB->m_pRight));
}
bool hasSubTree(BinaryTreeNode*pRootA, BinaryTreeNode*pRootB)
{
bool result = false;
if(pRootA != nullptr && pRootB != nullptr)
{
if(pRootA->m_nValue == pRootB->m_nValue)
result = doeeTreeHasTree2(pRootA, pRootB);
if(!result)
result = hasSubTree(pRootA->m_pLeft, pRootB);
if(!result)
result = hasSubTree(pRootA->m_pRight, pRootB);
}
return result;
}
void test_1()
{
std::cout << "test 1" << std::endl;
BinaryTreeNode*p_11 = createBinaryTreeNode(8);
BinaryTreeNode*p_12 = createBinaryTreeNode(8);
BinaryTreeNode*p_13 = createBinaryTreeNode(7);
BinaryTreeNode*p_14 = createBinaryTreeNode(9);
BinaryTreeNode*p_15 = createBinaryTreeNode(2);
BinaryTreeNode*p_16 = createBinaryTreeNode(4);
BinaryTreeNode*p_17 = createBinaryTreeNode(7);
connectTreeNodes(p_11, p_12, p_13);
connectTreeNodes(p_12, p_14, p_15);
connectTreeNodes(p_15, p_16, p_17);
std::cout << "Print original Tree A pre-order" << std::endl;
printTreePreOrder(p_11);
std::cout << std::endl;
BinaryTreeNode*p_21 = createBinaryTreeNode(8);
BinaryTreeNode*p_22 = createBinaryTreeNode(9);
BinaryTreeNode*p_23 = createBinaryTreeNode(2);
connectTreeNodes(p_21, p_22, p_23);
std::cout << "Print original Tree B pre-order" << std::endl;
printTreePreOrder(p_21);
std::cout << std::endl;
BinaryTreeNode*p_31 = createBinaryTreeNode(8);
BinaryTreeNode*p_32 = createBinaryTreeNode(9);
BinaryTreeNode*p_33 = createBinaryTreeNode(6);
connectTreeNodes(p_31, p_32, p_33);
std::cout << "Print original Tree C pre-order" << std::endl;
printTreePreOrder(p_31);
std::cout << std::endl;
std::cout << "Is Tree B is a kind sub_tree of Tree A ? " << hasSubTree(p_11, p_21) << std::endl;
std::cout << "Is Tree C is a kind sub_tree of Tree A ? " << hasSubTree(p_11, p_31) << std::endl;
std::cout << "Is Tree A is a kind sub_tree of Tree B ? " << hasSubTree(p_21, p_11) << std::endl;
}
void test_2()
{
std::cout << "test 2" << std::endl;
BinaryTreeNode*p_11 = createBinaryTreeNode(8);
BinaryTreeNode*p_12 = createBinaryTreeNode(8);
BinaryTreeNode*p_13 = createBinaryTreeNode(9);
connectTreeNodes(p_11, p_12, nullptr);
connectTreeNodes(p_12, p_13, nullptr);
std::cout << "Print original Tree A pre-order" << std::endl;
printTreePreOrder(p_11);
std::cout << std::endl;
BinaryTreeNode*p_21 = createBinaryTreeNode(8);
BinaryTreeNode*p_22 = createBinaryTreeNode(9);
connectTreeNodes(p_21, p_22, nullptr);
std::cout << "Print original Tree B pre-order" << std::endl;
printTreePreOrder(p_21);
std::cout << std::endl;
BinaryTreeNode*p_31 = createBinaryTreeNode(8);
BinaryTreeNode*p_32 = createBinaryTreeNode(5);
connectTreeNodes(p_31, p_32, nullptr);
std::cout << "Print original Tree C pre-order" << std::endl;
printTreePreOrder(p_31);
std::cout << std::endl;
std::cout << "Is Tree B is a kind sub_tree of Tree A ? " << hasSubTree(p_11, p_21) << std::endl;
std::cout << "Is Tree C is a kind sub_tree of Tree A ? " << hasSubTree(p_11, p_31) << std::endl;
std::cout << "Is Tree A is a kind sub_tree of Tree B ? " << hasSubTree(p_21, p_11) << std::endl;
}
void test_3()
{
std::cout << "test 3" << std::endl;
BinaryTreeNode*p_11 = createBinaryTreeNode(8);
BinaryTreeNode*p_12 = createBinaryTreeNode(8);
BinaryTreeNode*p_13 = createBinaryTreeNode(9);
connectTreeNodes(p_11, p_12, nullptr);
connectTreeNodes(p_12, p_13, nullptr);
std::cout << "Print original Tree A pre-order" << std::endl;
printTreePreOrder(p_11);
std::cout << std::endl;
BinaryTreeNode*p_21 = nullptr;
std::cout << "Print original Tree B pre-order" << std::endl;
printTreePreOrder(p_21);
std::cout << std::endl;
BinaryTreeNode*p_31 = nullptr;
std::cout << "Print original Tree C pre-order" << std::endl;
printTreePreOrder(p_31);
std::cout << std::endl;
std::cout << "Is Tree B is a kind sub_tree of Tree A ? " << hasSubTree(p_11, p_21) << std::endl;
std::cout << "Is Tree C is a kind sub_tree of Tree A ? " << hasSubTree(p_11, p_31) << std::endl;
std::cout << "Is Tree A is a kind sub_tree of Tree B ? " << hasSubTree(p_21, p_11) << std::endl;
}
void test_hasSubTree()
{
test_1();
test_2();
test_3();
}
int main(int argc, char**argv)
{
test_hasSubTree();
return 0;
}
剑指offer-子树结构判断
最新推荐文章于 2020-05-27 20:01:10 发布