LeetCode(100):相同的树
Easy!
题目描述:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: true
示例 2:
输入: 1 1 / \ 2 2 [1,2], [1,null,2] 输出: false
示例 3:
输入: 1 1 / \ / \ 2 1 1 2 [1,2,1], [1,1,2] 输出: false
解题思路:
判断两棵树是否相同和之前的判断两棵树是否对称都是一样的原理,利用深度优先搜索DFS来递归。
C++解法一:
1 class Solution { 2 public: 3 bool isSameTree(TreeNode *p, TreeNode *q) { 4 if (!p && !q) return true; 5 if ((p && !q) || (!p && q) || (p->val != q->val)) return false; 6 return isSameTree(p->left, q->left) && isSameTree(p->right, q->right); 7 } 8 };
这道题还有非递归的解法,因为二叉树的四种遍历(层序,先序,中序,后序)均有各自的迭代和递归的写法,这里我们先来看先序的迭代写法,相当于同时遍历两个数,然后每个节点都进行比较。
C++解法二:
1 class Solution { 2 public: 3 bool isSameTree(TreeNode* p, TreeNode* q) { 4 stack<TreeNode*> s1, s2; 5 if (p) s1.push(p); 6 if (q) s2.push(q); 7 while (!s1.empty() && !s2.empty()) { 8 TreeNode *t1 = s1.top(); s1.pop(); 9 TreeNode *t2 = s2.top(); s2.pop(); 10 if (t1->val != t2->val) return false; 11 if (t1->left) s1.push(t1->left); 12 if (t2->left) s2.push(t2->left); 13 if (s1.size() != s2.size()) return false; 14 if (t1->right) s1.push(t1->right); 15 if (t2->right) s2.push(t2->right); 16 if (s1.size() != s2.size()) return false; 17 } 18 return s1.size() == s2.size(); 19 } 20 };
其他几种遍历顺序的迭代写法应该也可同理实现。
天雨虽宽,不润无根之草。
佛门虽广,不渡无缘之人。