100. Same Tree
Easy
101531FavoriteShare
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
终于开始刷二叉树的题目了。一开始真的不懂,还好网上能找到一些资料。感谢下面大神的文章,给我一些启发:
https://blog.csdn.net/bg2bkk/article/details/37572499
在网页上跑不出来的时候确实需要VS调试一下。原本就是一道很简单,很基础的题目,认认真真做了,还是可以学点东西。下面是我AC的代码:
/**
* 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) {
if(p==NULL&&q==NULL)return true;
if(p==NULL||q==NULL)return false;
else if(p->left==NULL&&p->right==NULL&&q->left==NULL&&q->right==NULL)
{
if(p->val==q->val)return true;
else return false;
}
else
{
if (p->val != q->val)return false;//这一句一开始漏了,进VS调才发现这个问题,即使不是叶子节点也是需要判断是否相同的,如果不相同的话直接返回false,就不再进行递归比较了。
else
{
return (isSameTree(p->left,q->left)&&isSameTree(p->right,q->right));
}
}
}
};
我VS上调试的代码如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode *constructTree(char *dat, int len)
{
TreeNode *root = NULL;
int index = 0;
if (len > 0)
root = new TreeNode(dat[index] - '0');
else
return NULL;
list<TreeNode *> node;
node.push_back(root);
index++;
while (index < len)
{
if (!node.empty())
{
TreeNode *root = node.front();
if (index < len)
{
if (dat[index] != '#')
{
root->left = new TreeNode(dat[index] - '0');
node.push_back(root->left);
}
index++;
}
if (index < len)
{
if (dat[index] != '#')
{
root->right = new TreeNode(dat[index] - '0');
node.push_back(root->right);
}
index++;
}
node.pop_front();
}
}
return root;
}
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == NULL && q == NULL)return true;
else if (p == NULL && q != NULL)return false;
else if (q == NULL && p != NULL)return false;
else if (p->left == NULL && p->right == NULL && q->left == NULL && q->right == NULL)
{
if (p->val == q->val)return true;
else return false;
}
else
{
if (p->val != q->val)return false;
else
{
return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
}
}
}
int main()
{
std::cout << "Hello World!\n";
//TreeNode *root = NULL;//看注掉的这一片,一开始是如此笨的方法,不过这样写过以后,感觉对二叉树更理解一点了。
//root = new TreeNode(1);//二叉树根
//list<TreeNode *> node;
//node.push_back(root);
///*root->left = new TreeNode(NULL);
//node.push_back(root->left);*/
//root->right = new TreeNode(3);
//node.push_back(root->right);
//TreeNode *root1 = NULL;
//root1 = new TreeNode(1);//二叉树根
//list<TreeNode *> node1;
//node1.push_back(root1);
//root1->left = new TreeNode(2);
//node.push_back(root1->left);
//root1->right = new TreeNode(3);
//node1.push_back(root1->right);
//bool p = isSameTree(root,root1);
TreeNode *root = NULL;
TreeNode *root1 = NULL;
char dd[] = "1#24##3";
root = constructTree(dd,7);
char dd1[] = "1#42##3";
root1 = constructTree(dd1, 7);
bool p = isSameTree(root, root1);
std::cout << "isSameTree"<<p;