<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 ...
随机推荐
- 11g Rac PSU20180116手动补丁升级步骤
手动升级:软件包解压在新建的/home/grid/update 目录下ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1GRID_HOME=/u01 ...
- javascript的基础知识及面向对象和原型属性
自己总结一下javascript的基础知识,希望对大家有用,也希望大家来拍砖,毕竟是个人的理解啊 1.1 类型检查:typeof(验证数据类型是:string) var num = 123; cons ...
- c# 异步任务队列(可选是否使用单线程执行任务,以及自动取消任务)
使用demo,(.net framework 4.0 自行添加async wait 扩展库) class Program { static void Main(string[] args) { Con ...
- I/O多路复用技术
典型应用于以下场合 1.处理多个描述字时,比如同时处理套接字和磁盘IO.终端IO 2.一个客户同时处理多个套接字 3.服务器既要处理监听套接字,又要处理已连接套接字 4.既要处理TCP.也要处理UDP ...
- TOF相机基本知识
TOF是Time of flight的简写,直译为飞行时间的意思.所谓飞行时间法3D成像,是通过给目标连续发送光脉冲,然后利用传感器接收从物体返回的光,通过探测光脉冲的飞行时间来得到目标物的距离.TO ...
- -1.#IND000 &&图像类型转换
(1):float acos(float x) 参数x的范围为-1.0f到1.0f之间,返回值范围在0.0f到3.141592653f之间,值得注意的是:当x超出[-1.0f,1.0f]这个范围时此函 ...
- git基础讲解
idea :https://blog.csdn.net/autfish/article/details/52513465 eclipse:https://blog.csdn.net/yang57266 ...
- 【JS】【30】各种正则
前言: 0,基本规则:有点枯燥,可以参考下 正则表达式 – 教程 | 菜鸟教程 http://www.runoob.com/regexp/regexp-tutorial.html 1,校验手机号 2, ...
- 【LeetCode算法】LeetCode初级算法——字符串
在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...
- mysql修改时区的几种方法(转载自https://www.cnblogs.com/shiqiangqiang/p/8393662.html)
说明: 以下记录修改mysql时区的几种方法. 具体: 方法一:通过mysql命令行模式下动态修改 1.1 查看mysql当前时间,当前时区 select curtime(); #或select no ...