头歌——基于二叉链表的树结构相等的判断

任务描述

设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,按此方法创建两棵二叉树,然后编写递归算法判断这两棵树是否相等。

编程要求

输入

多组数据,每组数据有两行。每行为一个二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。

输出

每组数据输出一行。若两个二叉树相等输出“YES”,否则输出“NO”。

测试说明

平台会对你编写的代码进行测试:

测试输入: abcd00e00f00ig00h00 abcd00e00f00ig00h00 abd00e00cf00g00 abd00e00cf00h00 0

预期输出: YES NO

#define _CRT_SECURE_NO_WARNINGS 1


#include<iostream>
using namespace std;


//二叉树的二叉链表存储表示
typedef struct BiTNode
{
    char data;
    struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

//按先序次序输入二叉树结点的值,采用递归方法创建二叉树
void CreateBiTree(BiTree& T, char S[], int& i)
{
    
    if (S[i] == '0')
    {
        T = NULL;
    }
    else
    {
        T = new BiTNode;
        T->data = S[i];
        CreateBiTree(T->lchild, S, ++i);
        CreateBiTree(T->rchild, S, ++i);
    }
}


/*这里不可以使用cin >> S[i]; 书上的算法和实际代码是不一样的,在main()函数中
代码给了cin >> S1,所以函数中不可以使用cin,
这段代码放在else外面,if上面也是正确的。
T = new BiTNode;
T->data = S[i];

*/
//void CreateBiTree(BiTree& T, char S[], int& i)
//{
//    cin >> S[i];
//    
//
//    if (S[i] == '0')
//    {
//        T = NULL;
//    }
//    else
//    {
//        T = new BiTNode;
//        T->data = S[i];
//        CreateBiTree(T->lchild, S, ++i);
//        CreateBiTree(T->rchild, S, ++i);
//    }
//}


int Compare(BiTree T1, BiTree T2)
{

    /*如果满足第一个if语句的条件,那么剩下的if语句都将被跳过,不
    会再执行。这是因为在满足第一个if语句条件后,程序会执行对应的
    代码块,并直接跳出--{整个}--if-else if-else结构,继续执行后续
    的代码,因此,后面的if语句将不会被判断和执行。*/


    if (T1 == NULL && T2 == NULL) // 两棵树都为空,认为相等
        return 1;

    if (T1 == NULL || T2 == NULL) // 两棵树中仅有一棵为空,认为不相等
        return 0;

    if (T1->data != T2->data) // 节点值不相等,认为不相等
        return 0;

    /*这是错误的
    if (T1->data == T2->data) 
        return 1;*/

    /*这里要注意,当该结点的值存在且相等时,是接着递归左右子树,不可以
    进行判断,返回1,可以理解为结点的值存在且相等,是进行左右子树递归判断
    的一个条件*/

    int leftEqual = Compare(T1->lchild, T2->lchild); // 比较左子树
    int rightEqual = Compare(T1->rchild, T2->rchild); // 比较右子树

    return leftEqual && rightEqual; // 左右子树都相等才认为相等
}

int main()
{
    char S1[100], S2[100];


    /*,循环读取输入的字符数组 S1 和 S2,直到输入以 '0' 开头的字符串结
    束循环。每次循环创建两棵二叉树,并将其传入 Compare 函数进行比较。根
    据比较结果输出相应的结果。*/

    while (cin >> S1 && S1[0] != '0')
    {
        cin >> S2;

        int i = -1, j = -1;

        BiTree T1, T2;

        CreateBiTree(T1, S1, ++i);
        CreateBiTree(T2, S2, ++j);
        
        if (!Compare(T1, T2))
            cout << "NO" << endl;
        else
            cout << "YES" << endl;
    }
    return 0;
}

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于二叉链表存储结构的二叉树计算系统是一种利用二叉树数据结构实现的计算系统。该系统可以通过二叉树的遍历算法来实现各种计算操作,包括加减乘除、求幂、求根号等。在该系统每个节点都可以表示一个操作符或操作数,而二叉树的结构则可以表示操作符之间的优先级关系。通过遍历二叉树,可以按照正确的顺序执行各种计算操作,从而得到正确的结果。该系统具有简单、高效、易于扩展等优点,可以广泛应用于各种计算场景。 ### 回答2: 二叉链表是一种二叉树的存储结构,它使用指针将每个节点与其父节点、左子节点和右子节点连接起来。基于二叉链表二叉树计算系统利用二叉树的特点,实现数学表达式的计算,能处理各种数学运算和优先级,是计算机科学领域一大重要的算法。 二叉链表可以储存任何二叉树结构,包括储存在二叉树的各种数学运算。在基于二叉链表存储的二叉树计算系统每个节点都可以储存一个操作符或操作数,实现组个可以被计算的表达式。二叉链表的左子节点和右子节点在这里表示操作符的左右操作数,这样可以简单地将运算符和操作数组织起来,快速构建出计算表达式。 基于二叉链表二叉树计算系统,也可以采用后缀表达式来简化运算和计算表达式。后缀表达式也称为逆波兰表达式,与传统的缀表达式不同,它将操作符置于操作数之后。这样,所有的计算都可以直接按照后缀表达式顺序进行,大大简化了计算的算法。 综合来看,基于二叉链表二叉树计算系统可以将数学表达式快速转换为二叉树结构,通过二叉链表连接各个节点,可以方便地实现各种数学运算,并能够采用后缀表达式简化计算流程。这种基于二叉链表二叉树计算系统,成功地将数据结构和算法相结合,提升了程序运行的效率和算法的可维护性,为计算和数据处理提供了一个高效可靠的解决方案。 ### 回答3: 基于二叉链表存储结构的二叉树计算系统是一种计算机科学较为常见的数据结构,在数学和计算机科学有广泛的应用。在这种系统二叉树是一种非线性数据结构,其每个节点最多具有两个子节点。 在二叉链表存储结构每个节点都包含了一个指向其左子节点和右子节点的指针。这种结构使得计算系统能够轻松地遍历整个二叉树,并在节点之间传递信息。 在二叉树计算系统,通过在二叉树上进行遍历,可以实现各种计算任务,如查找最小值、计算二叉树节点数等。同时,在二叉树还可以存储表达式,通过遍历二叉树以解析表达式的值。 二叉树计算系统能够完成的任务非常多。其,最常见的任务之一是查找二叉树上最小值或最大值。这可以通过不断遍历二叉树并寻找最小值/最大值来实现。 此外,二叉树计算系统还可用于实现搜索功能。这种系统能够遍历整个二叉树以查找特定的值。例如,一个计算系统可以在二叉树查找特定的项,或在表达式查找特定的运算符。 总之,二叉链表存储结构的二叉树计算系统是一种功能强大的数据结构,具备高效、灵活等特点,在计算机科学和数学有着广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值