<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 ...
随机推荐
- java语言的运行机制
计算机高级编程语言按其程序的执行方式可分为编译型语言和解释型语言. 编译型语言是指使用专门的编译器,针对特定的操作系统将源程序代码一次性翻译成计算机能识别的机器指令.例如C.C++等都属于编译型语言. ...
- 两道人数多,课程少,query多的题
#每天进步一点点# 来两道很相似的题目~ (智商啊智商.....) hihoCoder #1236:Scores (简单的分桶法+bitset) 2015 Beijing Online的最后一题.题目 ...
- mysql 操作提示 1366 Incorrect string value
一.报错说明 数据库此字段的字符集与整理字符集是否与SQL语句传递数据的字符集相同:不相同则会引发MySQL1366错误. 二.产生原因 windows 安装MySql 的时候选择的是默认的编码,创建 ...
- golang iris html/temple
在使用golang的模板语法的过程中遇见自动转义问题(或者以我的理解下发的富文本html代码不是template.html类型,而是string类型),需要强制转型 func unescaped(x ...
- 2015 多校赛 第一场 1007 (hdu 5294)
总算今天静下心来学算法.. Description Innocent Wu follows Dumb Zhang into a ancient tomb. Innocent Wu’s at the e ...
- C#中大批量导入数据SqlBulkCopy
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- Android拼图-变形金刚
开篇 学了几个月的Android开发,动手做了一个简单的拼图小游戏,没有使用游戏框架,名字也纯属娱乐,比较粗糙请大家一笑别骂. 游戏界面是一张图片切割的6*6的小图片,并将其中一块拿走,玩家通过不同的 ...
- c++中的强制转换
一.C语言的强制转换1.1 隐性转换 不同数据类型之间赋值和运算,函数调用传递参数等等,由编译器完成 int nTmp = 10; short sTmp ...
- 数据结构——栈的实现(数组、Java)
巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...
- 【Oracle】修改参数的同时添加注释
当修改参数时添加注释,我们会用到如下语句: alter system set parameter=value comment='description'; --修改参数需要有相应权限的用户去执行. 例 ...