C/C++面试:42---设计函数判断两棵树是否相等

一、题目描述

  • 请书写一个函数,用来判断两棵树是否相等,如果相等返回true,否则返回其他值

二、解决方案

  • 判断两棵树是否相等的规则是:
    • 先判断两棵树的根节点的值是否相等
    • 接着向下遍历,判断左右节点的值是否相等
  • 例如,下面的两棵树是相等的

  • 例如,下面的两棵树是不相等的

  • 例如,下面的两棵树是不相等的

三、代码实现

  • 实现函数如下:
    • 进入之后首先判断两个节点是否都为空(返回true),是否会出现一个不为空另一个为空的情况(返回false)
    • 接着再判断两个节点的值,然后再递归判断它们的左右子节点
typedef struct node 
{
    // 构造函数
    node(int data, struct node* left, struct node* right): _data(data), _left(left), _right(right) { }

    // 节点数据以及左右子节点指针
    int _data;
    struct node* _left;
    struct node* _right;
} Node;

bool compareTree(Node *tree1, Node *tree2)
{
    // 如果两个节点都为空, 那么直接返回true即可
    if(tree1 == NULL && tree2 == NULL)
        return true;

    // 如果上面的if没有执行, 可以确定至少有一个节点不为空
    // 如果出现一个节点为空, 另一个节点不为空, 说明两棵树不相等, 返回falase即可
    if(tree1 == NULL || tree2 == NULL)
        return false;

    // 如果两个节点都为不空, 判断它们的节点值, 如果相等那么递归判断各自的左右子节点
    // 如果两个节点的值不相等了, 直接返回true
    if(tree1->_data == tree2->_data)
        return compareTree(tree1->_left, tree2->_left) && compareTree(tree2->_right, tree2->_right);
    else
        return false;
}

四、测试

测试1

#include <iostream>

using namespace std;

typedef struct node 
{
    // 构造函数
    node(int data, struct node* left, struct node* right): _data(data), _left(left), _right(right) { }

    // 节点数据以及左右子节点指针
    int _data;
    struct node* _left;
    struct node* _right;
} Node;

bool compareTree(Node *tree1, Node *tree2)
{
    // 如果两个节点都为空, 那么直接返回true即可
    if(tree1 == NULL && tree2 == NULL)
        return true;

    // 如果上面的if没有执行, 可以确定至少有一个节点不为空
    // 如果出现一个节点为空, 另一个节点不为空, 说明两棵树不相等, 返回falase即可
    if(tree1 == NULL || tree2 == NULL)
        return false;

    // 如果两个节点都为不空, 判断它们的节点值, 如果相等那么递归判断各自的左右子节点
    // 如果两个节点的值不相等了, 直接返回true
    if(tree1->_data == tree2->_data)
        return compareTree(tree1->_left, tree2->_left) && compareTree(tree2->_right, tree2->_right);
    else
        return false;
}


int main()
{
    // 构造A树
    Node *aLeft = new Node(2, nullptr, nullptr);
    Node *aRight = new Node(3, nullptr, nullptr);
    node *rootA = new Node(1, aLeft, aRight);

    // 构造B树
    Node *bLeft = new Node(2, nullptr, nullptr);
    Node *bRight = new Node(3, nullptr, nullptr);
    node *rootB = new Node(1, bLeft, bRight);

    // 判断两棵树是否相等
    std::cout << boolalpha << compareTree(rootA, rootB) << std::endl;

    return 0;
}
  • 两棵树的结构如下:

  • 运行结果如下:

测试2

#include <iostream>

using namespace std;

typedef struct node 
{
    // 构造函数
    node(int data, struct node* left, struct node* right): _data(data), _left(left), _right(right) { }

    // 节点数据以及左右子节点指针
    int _data;
    struct node* _left;
    struct node* _right;
} Node;

bool compareTree(Node *tree1, Node *tree2)
{
    // 如果两个节点都为空, 那么直接返回true即可
    if(tree1 == NULL && tree2 == NULL)
        return true;

    // 如果上面的if没有执行, 可以确定至少有一个节点不为空
    // 如果出现一个节点为空, 另一个节点不为空, 说明两棵树不相等, 返回falase即可
    if(tree1 == NULL || tree2 == NULL)
        return false;

    // 如果两个节点都为不空, 判断它们的节点值, 如果相等那么递归判断各自的左右子节点
    // 如果两个节点的值不相等了, 直接返回true
    if(tree1->_data == tree2->_data)
        return compareTree(tree1->_left, tree2->_left) && compareTree(tree2->_right, tree2->_right);
    else
        return false;
}


int main()
{
    // 构造A树
    Node *aLeft = new Node(2, nullptr, nullptr);
    Node *aRight = new Node(3, nullptr, nullptr);
    node *rootA = new Node(1, aLeft, aRight);

    // 构造B树
    Node *bLeft = new Node(2, nullptr, nullptr);
    Node *bRight = new Node(3, nullptr, nullptr);
    node *rootB = new Node(1, bLeft, bRight);

    // 判断两棵树是否相等
    std::cout << boolalpha << compareTree(rootA, rootB) << std::endl;

    return 0;
}
  • 两棵树的结构如下:

  • 运行结果如下:

测试3

#include <iostream>

using namespace std;

typedef struct node 
{
    // 构造函数
    node(int data, struct node* left, struct node* right): _data(data), _left(left), _right(right) { }

    // 节点数据以及左右子节点指针
    int _data;
    struct node* _left;
    struct node* _right;
} Node;

bool compareTree(Node *tree1, Node *tree2)
{
    // 如果两个节点都为空, 那么直接返回true即可
    if(tree1 == NULL && tree2 == NULL)
        return true;

    // 如果上面的if没有执行, 可以确定至少有一个节点不为空
    // 如果出现一个节点为空, 另一个节点不为空, 说明两棵树不相等, 返回falase即可
    if(tree1 == NULL || tree2 == NULL)
        return false;

    // 如果两个节点都为不空, 判断它们的节点值, 如果相等那么递归判断各自的左右子节点
    // 如果两个节点的值不相等了, 直接返回true
    if(tree1->_data == tree2->_data)
        return compareTree(tree1->_left, tree2->_left) && compareTree(tree2->_right, tree2->_right);
    else
        return false;
}


int main()
{
    // 构造A树
    Node *aLeft = new Node(2, nullptr, nullptr);
    Node *aRight = new Node(3, nullptr, nullptr);
    node *rootA = new Node(1, aLeft, aRight);

    // 构造B树
    Node *bLeft = new Node(2, nullptr, nullptr);
    Node *bRight = new Node(3, nullptr, nullptr);
    node *rootB = new Node(1, bLeft, bRight);

    // 判断两棵树是否相等
    std::cout << boolalpha << compareTree(rootA, rootB) << std::endl;

    return 0;
}
  • 两棵树的结构如下:

  • 运行结果如下:

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/107774570
今日推荐