LintCode 等价二叉树

来源:互联网 发布:切换ip软件 编辑:程序博客网 时间:2024/06/02 05:31

1.描述

检查两棵二叉树是否等价。等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等。

样例
    1             1   / \           / \  2   2   and   2   2 /             /4             4

就是两棵等价的二叉树。

    1             1   / \           / \  2   3   and   2   3 /               \4                 4

就不是等价的。

2.分析

该题和克隆二叉树有异曲同工之秒,两颗二叉树必须拥有相同的结构,并且对应位置上的节点值也相同。

先判断当前节点的值是否相同,之后按照相同的结构走下去判断后面的节点值是否也相同。

下面给出我两个AC代码,第一个代码在函数外定义了一个全局变量flag作为标志,第二个代码直接定义了

bool函数。相比之下,好像第二个高端大气一点O(∩_∩)O~

3.代码

(1)

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
public:
    /**
     * @aaram a, b, the root of binary trees.
     * @return true if they are identical, or false.
     */
    int flag=0;//flag作为标志,初始值为0,一旦有任何节点不相等,flag变为1
    void panduan(TreeNode* a, TreeNode* b)
    {
        if(a==NULL)
        {
            if(b!=NULL)
            flag=1;
            return;
        }
        if(b==NULL)
        {
            if(a!=NULL)
            flag=1;
            return;
        }
        if(a->val!=b->val)
        flag=1;
        //cout<<flag<<endl;
        panduan(a->left,b->left);
        panduan(a->right,b->right);
    }
    bool isIdentical(TreeNode* a, TreeNode* b) {
        // Write your code here
        panduan(a,b);
        if(flag==0) return 1;//若flag为0无变化,说明所有节点都有相同结构相同值
        else return 0;//若flag为1,则有节点不同
    }
};

(2)

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
public:
    /**
     * @aaram a, b, the root of binary trees.
     * @return true if they are identical, or false.
     */
    bool panduan(TreeNode* a, TreeNode* b)
    {
        if(a==NULL&&b==NULL)//若当前两个节点都为空,则当前两节点相同
        return true;
        if(a!=NULL&&b!=NULL&&a->val==b->val)
        return panduan(a->left,b->left)&&panduan(a->right,b->right);//对下面的节点进行比较,都相同时return true
        return false;
    }
    bool isIdentical(TreeNode* a, TreeNode* b) {
        // Write your code here
        return panduan(a,b);
    }
};

4.总结

等价二叉树,只有当两棵树结构和对应位置的节点值都相同时才等价。因此当前节点值比较完后

两棵树的节点应该按照同样的结构遍历子树进而继续判断节点值。当两个节点都为空时虽然没有

节点值但他们也是相等的。

0 0
原创粉丝点击