【Sicily】1002. 等价二叉树

来源:互联网 发布:c语言新建文件步骤 编辑:程序博客网 时间:2024/06/05 12:18

题目描述

两个二叉树结构相同,且对应结点的值相同,我们称这两个二叉树等价.

例如:以下两个二叉树等价

        1           1       /  \        /  \      2   3       2    3

而以下两个则不等价

        1           1       /  \        /  \      2    3      3    2

以下两个也不等价

        1           1       /  \        /  \      2    3      2    2

给出两个二叉树p和q,判断它们是否等价.

p和q的结点数不多于100000,每个结点的数值在1和1000000000之间.

请为下面的Solution类实现解决上述问题的isEqual函数,函数的两个参数p和q分别代表两个二叉树的根节点,如果以p和q为根的二叉树等价则函数返回true,否则返回false.

/**  Definition for a binary tree node.  struct TreeNode {      int val;      TreeNode *left;      TreeNode *right;      TreeNode(int x) : val(x), left(NULL), right(NULL) {}  }; */class Solution {public:       bool isEqual(TreeNode* p, TreeNode* q) {    }};

注意:你只需要提交Solution类的代码,你在本地可以编写main函数测试程序,但不需要提交main函数的代码,也不需要提交TreeNode的定义. 注意不要修改类和函数的名称.

解题思路

递归。
两棵树之间的关系,分为下面五种情况:

  • 都有左右子树,递归遍历两个子树
  • 都只有左子树,递归遍历左子树
  • 都只有右子树,递归遍历右子树
  • 都为叶子节点,直接判定当前值是否相同
  • 其他情况,则两棵树不等价

AC代码

// Problem#: 20618// Submission#: 5142914// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/// All Copyright reserved by Informatic Lab of Sun Yat-sen University/**  Definition for a binary tree node.  struct TreeNode {      int val;      TreeNode *left;      TreeNode *right;      TreeNode(int x) : val(x), left(NULL), right(NULL) {}  }; */class Solution {public:       bool isEqual(TreeNode* p, TreeNode* q) {           if (p->val != q->val)               return false;           if (p->left != NULL && p->right != NULL && q->left != NULL && q->right != NULL)               return isEqual(p->left, q->left) && isEqual(p->right, q->right);           else if (p->left != NULL && p->right == NULL && q->left != NULL && q->right == NULL)               return isEqual(p->left, q->left);           else if (p->left == NULL && p->right != NULL && q->left == NULL && q->right != NULL)               return isEqual(p->right, q->right);           else if (p->left == NULL && p->right == NULL && q->left == NULL && q->right == NULL)               return true;           else                return false;             }};                                 
原创粉丝点击