问题描述
Given two binary trees, write a function to check if they are the same or not.
Two binary trees are considered the same if they are structurally identical and the nodes have the same value.
Example 1:
Input: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
Output: true
Example 2:
Input: 1 1
/ \
2 2
[1,2], [1,null,2]
Output: false
Example 3:
Input: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
Output: false
思路分析
给出两棵树,返回两棵树是否相同。相同要求树的结构相同,以及相应结点的值也相同。
自己实现了一个返回值为string的前序遍历的方法,如果没有结点就返回" "
然后比对两个string是否相同。
代码
/**
* 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) {
string a = PreorderVisitTree(p),b = PreorderVisitTree(q);
return (a == b);
}
string PreorderVisitTree(TreeNode* p){
string s = "";
if(p){
s += p->val;
if (p->left != NULL)
s += PreorderVisitTree(p->left);
else
s += " ";
if(p->right != NULL)
s += PreorderVisitTree(p->right);
else
s += " ";
}
else
return " ";
return s;
}
};
时间复杂度:O(m+n) //m, n为树的结点数
反思
这个解法太慢了,要完全遍历两棵树才能出结果。看Discussion有直接递归调用isSameTree的,惊为天人,实现代码:
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p == NULL || q == NULL)
return (p == q);
else
return((p->val == q->val) && isSameTree(p->left, q->left)&& isSameTree(p->right, q->right));
}
};
若两结点有不存在的,看是否有结构不同,若结构相同,则比较值是否相同,以及左右子结点的结构和值是否相同。