这题解法很多,我就用的最简单的递归和非递归前序遍历。
解法1:递归
#include <iostream>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
bool isSameTree(TreeNode* p, TreeNode* q) {
if (!p && !q) return true;
if (!p || !q) return false;
if (p && q && p->val!=q->val) return false;
if (p && q && p->val==q->val)
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
int main()
{
TreeNode a1(1), b1(2), c1(1);
TreeNode a2(1), b2(2), c2(1);
a1.left=&b1;
a1.right=&c1;
a2.left=&b2;
a2.right=&c2;
cout<<isSameTree(&a1, &a2);
return 0;
}
解法2:前序遍历。
//preorder
bool isSameTree(TreeNode* p, TreeNode* q) {
stack<TreeNode*> s1, s2;
if ((p&&!q) || (!p&&q)) return false;
while((p || !s1.empty()) && (q || !s2.empty())) {
while(p && q) {
if (p->val==q->val) {
s1.push(p);
p=p->left;
s2.push(q);
q=q->left;
} else {
return false;
}
}
if ((p && !q) || (!p && q)) return false;
if ((s1.empty() && !s2.empty()) || (!s1.empty() && s2.empty())) return false;
if (!s1.empty() && !s2.empty()) {
p=s1.top();
q=s2.top();
s1.pop();
s2.pop();
p=p->right;
q=q->right;
}
}
return true;
}
以后再做
解法3:非递归中序遍历
解法4:非递归后序遍历
解法5:按层次遍历(用队列)