<LeetCode OJ> 100. Same Tree
100. Same Tree
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
<LeetCode OJ> 100. Same Tree的更多相关文章
- 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 ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- 【LEETCODE OJ】Binary Tree Postorder Traversal
Problem Link: http://oj.leetcode.com/problems/binary-tree-postorder-traversal/ The post-order-traver ...
- 【LeetCode OJ】Same Tree
Problem Link: https://oj.leetcode.com/problems/same-tree/ The following recursive version is accepte ...
- 【LeetCode OJ】Symmetric Tree
Problem Link: https://oj.leetcode.com/problems/symmetric-tree/ To solve the problem, we can traverse ...
- 【LeetCode OJ】Binary Tree Level Order Traversal
Problem Link: https://oj.leetcode.com/problems/binary-tree-level-order-traversal/ Traverse the tree ...
- 【LeetCode OJ】Binary Tree Zigzag Level Order Traversal
Problem Link: https://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ Just BFS fr ...
- 【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 ...
- 【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 ...
- 【LEETCODE OJ】Binary Tree Preorder Traversal
Problem Link: http://oj.leetcode.com/problems/binary-tree-preorder-traversal/ Even iterative solutio ...
随机推荐
- JS 中构造函数和普通函数的区别(详)
1.构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写 2.构造函数和普通函数的区别在于:调用方式不一样.作用也不一样(构造函数用来新建实例对象) 3.调用方式不一样. 普通 ...
- Linux Shell Scripting Cookbook 读书笔记 5
sed,awk 1. sed (string editor) 使用-i可以将结果运用于原文件 sed 's/text1/text2/' file > newfile mv newfile fil ...
- POJ 1442 Treap模板
// by SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using na ...
- [Offer收割]编程练习赛40
不到一个小时AK,虽然是VP的,舒服,第一次.都简单的一比,没什么可说的. 查找三阶幻方 #pragma comment(linker, "/STACK:102400000,10240000 ...
- javascript学习中自己对作用域和作用域链理解
在javascript学习中作用域和作用域链还是相对难理解些,下面我关于javascript作用域和作用域链做一下详细介绍,给各位初学者答疑解惑. 首先我们介绍一下什么是作用域? 从字面上理解就是起 ...
- fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能
用vue写的 显示,隐藏 hide(){ this.canvas.getActiveObject().set('opacity', 0).setCoords(); this.canvas.reques ...
- Outlook2010规则:尝试操作失败,找不到某个对象
可以尝试通过清除规则的方法 启动 Outlook 并删除基于客户端的规则:outlook /cleanclientrules 如果失败,再执行这句 启动 Outlook 并删除基于服务器端的规则:ou ...
- Struts2学习笔记 - Part.01
1.关于Struts2中的struts.xml文件中action设置 <!-- 它是一个通用action,此处的*表明它可以处理任意的请求--> <action name=" ...
- 一个关于C++拷贝构造的bug
#include <iostream> using namespace std; class A { public: A(int a) {}; A(const A&) = defa ...
- 使用PCL::GPU::遇到问题
一:使用GPU进行点云分割,理论上可以极大地加快分割速度: 于是对PCL1.7.1进行了编译,回到32位系统,重设QT,编译成功(时间好漫长,一定要配置仔细,否则编译一次又一次浪费更多时间): 使用时 ...