leetcode刷题日记:100.Same Tree(相同的树)和101.Symmetric Tree(对称二叉树)

100.Same Tree(相同的树)

题目给了我们两棵树要我们判断这两颗树是否相同,我首先想到的就是前序序列与中序序列可以唯一确定一棵树,如果我能分别确定这两棵树的前序序列与中序序列,然后再分别比较它们的前序序列与中序序列就能得到这两棵树是否相同,这样一想似乎没错,但是如果树的结点的值一样呢?一样你还能通过前序序列与中序序列判断吗?显然不能,也就是说通过树的前序序列与中序序列并不能实现判断两颗树是否相同,因为有些情况是这种方法不能判断的。

那么有没有更好的方法呢?

我们来思考以下如果两棵树p,q相同是不是这两个树的根结点相同并且p的左子树与q的左子树相同,p的右子树与q的右子树相同,也就是说p与q是否相同,需要判断三部分,两棵树根结点的值是否相同,两棵树左子树是否相同,两棵树右子树是否相同,树的子树是否相同是不是也需要用到上面说的条件,判断子树根结点的值,子树的左子树,子树的右子树,显然这是递归定义的,我们可以采用递归的方法进行问题的解决。

接下来我们来探讨终止条件如何确定,假设我们有以下两颗树p、q,

我们将这两颗树重叠到一起,假设树的所有结点的值都是1,我们重叠后相同的部分用红色表示,不同的部分仍用各自的颜色表示,我们可以得到下面这样一棵树。

我们在遍历的时候一定会到达其底层结点,到达其底层结点之后,此时所在的结点是一个树的根结点而且此子树没有左孩子与右孩子对吧,如果再遍历左孩子一定会得到一个NULL,遍历右孩子也同理,但是在另一棵树递归时走的是相同的路径下来的,此树的现在的这一个结点也应该是NULL对吧,因为只有这样才是相同的,也就是说要终止递归的条件应该是 p = N U L L , q = N U L L p=NULL,q=NULL p=NULL,q=NULL,此时返回true,如果一个树的当前结点是NULL,另一颗树的当前结点不是NULL,那么这两棵树在相同的位置一个有结点一个没有,必然两颗树不会相同。所以返回的终止条件 p = N U L L , q ≠ N U L L 或者 p ≠ N U L L , q = N U L L p=NULL,q\neq NULL或者p\neq NULL,q=NULL p=NULL,q=NULL或者p=NULL,q=NULL此时应该返回false。这是递归终止的条件,但是其他的不是递归终止的要返回什么呢?

终止递归的层是NULL对吧,上一层就是树的一个结点了,这一个结点是不是子树,只有一个根结点的也是一个树,如何判断两个树的子树是否相等,也就是说必须判断三个部分当前结点的值、左子树、右子树,当都为真时,返回真,所以逻辑联结词用且。写成递归公式如下:
i s S a m e T r e e ( p , q ) = { t r u e p = N U L L , q = N U L L f a l s e p = N U L L , q ≠ N U L L 或者 p ≠ N U L L , q = N U L L p − > v a l = = q − > v a l 且 i s S a m e T r e e ( p − > r i g h t , q − > r i g h t ) 且 i s S a m e T r e e ( p − > l e f t , q − > l e f t ) 其他情况 isSameTree(p, q)=\begin{cases} true & p=NULL,q=NULL \\ false & p=NULL,q\neq NULL或者p\neq NULL,q=NULL\\ p->val==q->val且isSameTree(p->right, q->right)且isSameTree(p->left,q->left) & 其他情况 \end{cases} isSameTree(p,q)=⎩ ⎨ ⎧truefalsep−>val==q−>val且isSameTree(p−>right,q−>right)且isSameTree(p−>left,q−>left)p=NULL,q=NULLp=NULL,q=NULL或者p=NULL,q=NULL其他情况

经过比较我们可以得知红色标记的这两个点是相同的

同理可以得到红色结点的兄弟是相同的

然后返回上一级,我们可以比较根结点的值得出如图所示的两颗子树是相同的

如此进行下去就可以知道这两棵树是不是相同的树。

代码如下:

c 复制代码
 bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL && q==NULL){
        return true;
    }
    if(p==NULL&&q!=NULL||p!=NULL&&q==NULL){
        return false;
    }
    return p->val==q->val&&isSameTree(p->right, q->right)&&isSameTree(p->left, q->left);
}

运行结果如图所示:

101.Symmetric Tree(对称二叉树)

有了上面的,对称二叉树就很好理解了,就是判断根结点的两个子树是否对称相等呗,如果对称相等,那么在左子树中向左的就是右子树中向右的,只需要在100.Same Tree(相同的树)代码改一点就行了。

代码如下:

c 复制代码
bool isSymmetricTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL && q==NULL){
        return true;
    }
    if(p==NULL&&q!=NULL||p!=NULL&&q==NULL){
        return false;
    }
    return p->val==q->val&&isSymmetricTree(p->left, q->right)&&isSymmetricTree(p->right, q->left);
}
bool isSymmetric(struct TreeNode* root) {
    return isSymmetricTree(root->left, root->right);
}

运行结果如图所示:

相关推荐
JingHongB13 分钟前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_4327022616 分钟前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习19 分钟前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat71519 分钟前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习22 分钟前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论
武子康34 分钟前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
passer__jw7671 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾1 小时前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序1 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒2 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法