您的位置:首页 > 其它

Leetcode Same Tree

2013-10-12 09:56 399 查看
判断两个树是否相同,包括树的结构和借点得知都一样。

同样可以用递归判断两棵树的左子树和右子树是否相同,也可以用非递归对两棵树进行层次遍历,并标记他们是左结点还是右结点,然后进行判断。

非递归法:

/**
* Definition for binary tree
* 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) {
// Note: The Solution object is instantiated only once and is reused by each test case.
queue<TreeNode*> p_tree, q_tree;
queue<bool> p_tag, q_tag;
if(p != NULL){
p_tree.push(p);
p_tag.push(true);
}
if(q != NULL){
q_tree.push(q);
q_tag.push(true);
}
TreeNode *ptr, *qtr;
int ptg, qtg;
while(!p_tree.empty() || !q_tree.empty()){
if(p_tree.size() != q_tree.size())
return false;
ptr = p_tree.front(), qtr = q_tree.front();
ptg = p_tag.front(), qtg = q_tag.front();
if(ptr->val != qtr->val || ptg != qtg)
return false;
p_tree.pop();
q_tree.pop();
p_tag.pop();
q_tag.pop();
if(ptr->left != NULL){
p_tree.push(ptr->left);
p_tag.push(true);
}
if(ptr->right != NULL){
p_tree.push(ptr->right);
p_tag.push(false);
}
if(qtr->left != NULL){
q_tree.push(qtr->left);
q_tag.push(true);
}
if(qtr->right != NULL){
q_tree.push(qtr->right);
q_tag.push(false);
}
}
return true;
}
};


递归法:
/**
* Definition for binary tree
* 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) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(p == NULL && q == NULL)
return true;
if((p != NULL && q == NULL) || (p == NULL && q != NULL) || p->val != q->val)
return false;
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历