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 };

其他几种遍历顺序的迭代写法应该也可同理实现。

猜你喜欢

转载自www.cnblogs.com/ariel-dreamland/p/9159797.html