王道书 P150 T17(判断两棵二叉树是否相似)+ 拓展(判断两棵二叉树是否相等)

/**
 * 用二叉树链式存储实现 王道 P150 T17(判断两棵二叉树是否相似)+ 拓展(判断两棵二叉树是否相等)
 *
 * ①算法思想
 * ①判断两棵二叉树是否相似(树形相似)
 * ②判断两棵二叉树是否相等
 * 对于①:
 * 当两棵树是空的,就直接相似;(出口1)
 * 当两棵树一棵树为空,一棵树不为空,那么两棵树就不相似;(出口2)
 * 当两棵树不为空,就要进行判断左子树是否相似,右子树是否相似)。
 * 对于②:
 * 方法一,首先要保证树形的相似,然后进行数据的比较,如果相等,就继续比较左右子树,如果不相等,直接返回false。
 * 方法二,首先如果数为空,直接向等;如果树一棵为空一棵不为空,直接不等;如果两棵都不为空,进行数据比较,
 *       如果数据相等,继续比较左右子树,如果数据不相等,那么两棵树就不相等,返回false。
 *
 *
 * ②算法设计
 */


#include 
#include 
#define MaxSize 100

typedef struct BiTreeNode{
    int data;
    BiTreeNode *lchild,*rchild;
}BiTreeNode,*BiTree;


//①判断两棵树是否相似
bool IsSimilar(BiTree T1,BiTree T2){
    if(!T1 && !T2){
        return true;
    }
    else if(!T1 && T2 || T1 && !T2){
        return false;
    }
    else if(T1 && T2){
        return IsSimilar(T1 -> lchild,T2 -> lchild) && IsSimilar(T1 -> rchild,T2 -> rchild);
    }
}
//②判断两棵树是否相等
//方法一:
bool IsEqual_1(BiTree T1,BiTree T2){
    if(!T1 && !T2){
        return true;
    }
    else if(!T1 && T2 || T1 && !T2){
        return false;
    }
    //以上保证了树形的相似
    else{
        if(T1 -> data == T2 -> data){
            return IsEqual_1(T1 -> lchild,T2 -> lchild) && IsEqual_1(T2 -> rchild,T2 -> rchild);
        }else
            return false;
    }
}
//方法二:
bool IsEqual_2(BiTree T1,BiTree T2){
    if(!T1 && !T2)//树为空直接相等
        return true;
    if(T1 -> data != T2 -> data)
        return false;
    if(T1 -> data == T2 -> data){
        return IsEqual_2(T1 -> lchild,T2 -> lchild) && (T1 -> rchild,T2 -> rchild);
    }else
        return false;
}

你可能感兴趣的:(王道书第五章综合应用题,算法,数据结构,c++,链表,c语言)