王道p150 17.试设计判断两棵二叉树是否相似的算法。(c语言代码实现)

若T1和T2都是空树,则相似;若有一个为空另一个不空,则必然不相似:否则递归地比较它们的左、右子树是否相似。

本题代码如下

int similar(tree* t1, tree* t2)
{
    int lefts, rights;
    if (*t1 == NULL && *t2 == NULL)//两树皆空
        return 1;
    else if (*t1 == NULL || *t2 == NULL)//只有一树为空
        return 0;
    else//递归判断
    {
        lefts = similar(&(*t1)->lchild, &(*t2)->lchild);
        rights = similar(&(*t1)->rchild, &(*t2)->rchild);
        return (lefts && rights);
    }
}

完整测试代码为

#include
#include
typedef struct treenode
{
    char data;
    struct treenode* lchild, * rchild;
} treenode, * tree;
void buildtree(tree* t)
{
    char ch;
    ch = getchar();
    if (ch == '#')
        *t = NULL;
    else
    {
        *t = (treenode*)malloc(sizeof(treenode));
        (*t)->data = ch;
        (*t)->lchild = NULL;
        (*t)->rchild = NULL;
        buildtree(&(*t)->lchild);
        buildtree(&(*t)->rchild);
    }
}
int similar(tree* t1, tree* t2)
{
    int lefts, rights;
    if (*t1 == NULL && *t2 == NULL)//两树皆空
        return 1;
    else if (*t1 == NULL || *t2 == NULL)//只有一树为空
        return 0;
    else//递归判断
    {
        lefts = similar(&(*t1)->lchild, &(*t2)->lchild);
        rights = similar(&(*t1)->rchild, &(*t2)->rchild);
        return (lefts && rights);
    }
}
int main()
{
    tree t1, t2;
    buildtree(&t1);
    getchar();
    buildtree(&t2);
    int T = similar(&t1, &t2);
    if (T == 1)
        printf("相似");
    else
        printf("不相似");
    return 0;
}

用下面的两棵树测试

/*

第一棵树

    A
B            
AB###

第二棵树
    C
        D
C#D##

换另外一种测试

/*

第一棵树

    A       
A##

第二棵树
    C
C##

你可能感兴趣的:(树,算法,c语言,数据结构,链表)