数据结构-树的子结构

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

分析:需要先找到data一样的root节点,然后遍历左右孩子,看是否和B节点完全相等。

/*
剑指offer面试题18
树是考察数据结构内功的不二之选
一般代码简洁的话就需要用递归。
而且由于树运用的指针比较多,一定要检查安全性
*/
#include <iostream>

using namespace std;

struct BinaryTree{
    int data;
    BinaryTree* lchild;
    BinaryTree* rchild;
};

bool TreeHaveIt(BinaryTree* parents,BinaryTree* children){
    //鲁棒性
    if(children == NULL){
        return true;
    }
    if(parents == NULL){
        return false;
    }
    if(children->data != parents->data){
        return false;
    }

    return TreeHaveIt(parents->lchild,children->lchild) && TreeHaveIt(parents->rchild,children->rchild);
}

bool HasSubTree(BinaryTree* parents,BinaryTree* children){
    bool b = false;
    //边界检测
    if(parents != NULL && children != NULL){
        if(parents->data == children->data){
            b = TreeHaveIt(parents,children);
        }
        if(!b){
            b = HasSubTree(parents->lchild,children);
        }
        if(!b){
            b = HasSubTree(parents->rchild,children);
        }
    }
    return b;
}


BinaryTree* Create(int n){
    if(n == 1){
        BinaryTree* root = new BinaryTree;
        root->data = 8;
        BinaryTree* lchild = new BinaryTree;
        lchild->data = 8;
        BinaryTree* rchild = new BinaryTree;
        rchild->data = 7;
        root->lchild = lchild;
        root->rchild = rchild;

        BinaryTree* lchild1 = new BinaryTree;
        lchild1->data = 9;
        BinaryTree* rchild1 = new BinaryTree;
        rchild1->data = 2;
        lchild->lchild = lchild1;
        lchild->rchild = rchild1;

        BinaryTree* lchild2 = new BinaryTree;
        lchild2->data = 4;
        BinaryTree* rchild2 = new BinaryTree;
        rchild2->data = 7;
        rchild1->lchild = lchild2;
        rchild1->rchild = rchild2;
        return root;
    }
    else{
        BinaryTree* root = new BinaryTree;
        root->data = 8;
        BinaryTree* lchild = new BinaryTree;
        lchild->data = 9;
        BinaryTree* rchild = new BinaryTree;
        rchild->data = 2;
        root->lchild = lchild;
        root->rchild = rchild;
    }
}

void print(BinaryTree* root){
    if(root != NULL){
        cout << root->data << " ";
        print(root->lchild);
        print(root->rchild);
    }
}

int main()
{
    BinaryTree* parents = Create(1);
    BinaryTree* children = Create(2);

    //print(parents);

    bool result = HasSubTree(parents,children);

    cout << result << endl;

    return 0;
}

 

posted on 2014-05-13 14:45  Ja °  阅读(153)  评论(0编辑  收藏  举报

导航