100. Same Tree

Total Accepted: 100129 Total
Submissions: 236623 Difficulty: Easy

Given two binary trees, write a function to check if they are equal or not.

Two binary trees are considered equal if they are structurally identical and the nodes have the same value.

1,朴素的递归思想:

1)。函数返回值怎样构成原问题的解

明白函数意义,

推断以节点p和q为根的二叉树是否一样,获取当前以p和q为根的子树的真假情况

bool isSameTree(TreeNode* p, TreeNode* q){

函数体.....

}

解的构成,

每个节点的左子树和右子树同一时候一样才干组合成原问题的解。原问题接收来自全部子问题的解。仅仅要有一个假就可以全部为假(与运算)

2)。递归的截止条件

截止条件就是能够得出结论的条件。

假设p和q两个节点是叶子,即都为NULL,能够觉得是一样的。return true

假设存在一个为叶子而还有一个不是叶子,显然当前两个子树已经不同,return false

假设都不是叶子,但节点的值不相等,最显然的不一样。return false

3)总是反复的递归过程

当2)中全部的条件都“躲过了”,即q和p的两个节点是同样的值。那就继续推断他们的左子树和右子树是否一样。

即,isSameTree(p->left,q->left)和isSameTree(p->right,q->right)

4)控制反复的逻辑

显然仅仅有两个子树都同样时,才干获取终于结果,否则即为假。

例如以下所看到的

return (isSameTree(p->left,q->left))&&(isSameTree(p->right,q->right));

/**
* 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 isSameTree(TreeNode* p, TreeNode* q) {
if(p==NULL&&q==NULL)
return true;
else if(p==NULL&&q!=NULL)
return false;
else if(p!=NULL&&q==NULL)
return false;
else if(p!=NULL&&q!=NULL && p->val!=q->val)
return false;
else
return (isSameTree(p->left,q->left))&&(isSameTree(p->right,q->right));
}
};

2,广度优先迭代遍历:

/**
* 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 isSameTree(TreeNode* p, TreeNode* q) {
if(q==NULL && p ==NULL)
return true;
if(q == NULL && p!=NULL || q != NULL && p==NULL)
return false;
//广度优先遍历两个子树是否一样
queue<TreeNode*> que1,que2;
TreeNode* curNode1=p;
TreeNode* curNode2=q;
que1.push(curNode1);
que2.push(curNode2);
while (!que1.empty()&&!que2.empty())
{
curNode1=que1.front();//出队首元素
que1.pop();//删除队首元素
curNode2=que2.front();//出队首元素
que2.pop();//删除队首元
if(!(curNode1->val==curNode2->val))
return false;
if(curNode1->left!=NULL && curNode2->left!=NULL)
{
que1.push(curNode1->left);
que2.push(curNode2->left);
} if(curNode1->right!=NULL && curNode2->right!=NULL)
{
que1.push(curNode1->right);
que2.push(curNode2->right);
}
if(curNode1->left == NULL && curNode2->left!=NULL || curNode1->left != NULL && curNode2->left==NULL)
return false; if(curNode1->right == NULL && curNode2->right!=NULL || curNode1->right != NULL && curNode2->right==NULL)
return false;
}
return true;
}
};

3,前序式深度优先搜索来做:

/**
* 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 isSameTree(TreeNode* p, TreeNode* q) {
if(q==NULL && p ==NULL)
return true;
if(q == NULL && p!=NULL || q != NULL && p==NULL)
return false;
//前序式深度优先遍历两个子树是否一样
stack<TreeNode*> stk1,stk2;
TreeNode* curNode1=p;
TreeNode* curNode2=q;
stk1.push(curNode1);
stk2.push(curNode2);
while (!stk1.empty()&&!stk2.empty())
{
curNode1=stk1.top();//出队首元素
stk1.pop();//删除队首元素
curNode2=stk2.top();//出队首元素
stk2.pop();//删除队首元
if(!(curNode1->val==curNode2->val))
return false;
if(curNode1->left!=NULL && curNode2->left!=NULL)
{
stk1.push(curNode1->left);
stk2.push(curNode2->left);
} if(curNode1->right!=NULL && curNode2->right!=NULL)
{
stk1.push(curNode1->right);
stk2.push(curNode2->right);
}
if(curNode1->left == NULL && curNode2->left!=NULL || curNode1->left != NULL && curNode2->left==NULL)
return false; if(curNode1->right == NULL && curNode2->right!=NULL || curNode1->right != NULL && curNode2->right==NULL)
return false;
}
return true;
}
};

注:本博文为EbowTang原创,兴许可能继续更新本文。假设转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50507131

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895

&lt;LeetCode OJ&gt; 100. Same Tree的更多相关文章

  1. LeetCode OJ 100. Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  2. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  3. 【LEETCODE OJ】Binary Tree Postorder Traversal

    Problem Link: http://oj.leetcode.com/problems/binary-tree-postorder-traversal/ The post-order-traver ...

  4. 【LeetCode OJ】Same Tree

    Problem Link: https://oj.leetcode.com/problems/same-tree/ The following recursive version is accepte ...

  5. 【LeetCode OJ】Symmetric Tree

    Problem Link: https://oj.leetcode.com/problems/symmetric-tree/ To solve the problem, we can traverse ...

  6. 【LeetCode OJ】Binary Tree Level Order Traversal

    Problem Link: https://oj.leetcode.com/problems/binary-tree-level-order-traversal/ Traverse the tree ...

  7. 【LeetCode OJ】Binary Tree Zigzag Level Order Traversal

    Problem Link: https://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ Just BFS fr ...

  8. 【LeetCode OJ】Binary Tree Level Order Traversal II

    Problem Link: https://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ Use BFS from th ...

  9. 【LeetCode OJ】Binary Tree Maximum Path Sum

    Problem Link: http://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ For any path P in a bina ...

  10. 【LEETCODE OJ】Binary Tree Preorder Traversal

    Problem Link: http://oj.leetcode.com/problems/binary-tree-preorder-traversal/ Even iterative solutio ...

随机推荐

  1. [转载]RouteOS安装设置

    原文地址:RouteOS安装设置作者:抟鹏追梦 RouteOS2.7.4可以将一台普通的PC机变成一台专业的路由器,高到ISP的核心路器/认证网关-因为它功能强大稳定,低到家庭网关防火墙-因为它免费. ...

  2. Linux Shell Scripting Cookbook 读书笔记 5

    sed,awk 1. sed (string editor) 使用-i可以将结果运用于原文件 sed 's/text1/text2/' file > newfile mv newfile fil ...

  3. 禁止button标签提交form表单,变成普通按钮

    button有个type属性,属性值可为button.submit.reset button=普通按钮,直接点击不会提交表单submit=提交按钮,点击后会提交表单reset=表单复位 当button ...

  4. SQLServer Union 和 Union All 在Insert 语句中的不同效果

    如果不是发了那个帖子还不会像这样意外发现这两者的不同,好歹了也工作了一段时间,真是汗颜 上例子: 执行此条插入语句后,只会插入两条数据,因为会把完全重复的数据过滤掉 insert into tests ...

  5. 关于原生app、webApp、混合app的介绍

    WebApp 原生App(Native App) 混合App(hybrid App) webApp: 用html5,css3 js开发的网页,运行在移动端的浏览器 zepto.angular.vue. ...

  6. Android一对多蓝牙连接示例APP

    一对多蓝牙连接示例,基于Google BluetoothChat修改,实现一对多聊天(一个服务端.多个客户端),类似聊天室. 主要功能: 客户端的发出的消息所有终端都能收到(由服务端转发) 客户端之间 ...

  7. 关于maven-基本

    笔记 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object ...

  8. JS面向对象(1)——构造函数模式和原型模式

    1.构造函数模式 构造函数用来创建特定的类型的对象.如下所示: function Person(name,age,job){ this.name=name; this.job=job; this.ag ...

  9. Java中数组获取最大值

    最大值获取:从数组的所有元素中找出最大值. 实现思路: 定义变量,保存数组0索引上的元素 遍历数组,获取出数组中的每个元素 将遍历到的元素和保存数组0索引上值的变量进行比较 如果数组元素的值大于了变量 ...

  10. JS 封装一个显示时间的函数

    s(); function s (){ var mydate=new Date(); var y = mydate.getFullYear(); var m = mydate.getMonth(); ...