题目
理解
题目的意思是判断两颗二叉树的叶子值序列是否相同,若相同则为叶相似返回Ture,否则返回False。
解题过程
基本的思路就是从根部遍历,找到叶子结点,并将叶子值存起来,再比较两个叶值序列是否相同。
但遇到几个问题:
- 开始想要自己创建两颗树,再取叶值进行比较,但是创建顺序的和测试顺序不一样,还出了好多错呀,就果断放弃
- 还有提交时,没有把结构体注释掉(不懂为啥要注释掉),一直编译不过,但是到不到问题,浪费了很多时间
- 最开始算法在寻找叶子结点时
没有用容器(好像有超时的),(其实后来发现是没有用引用,第二个代码,还快一点) ,编译通过了但是提交后部分有错。没有使用引用导致函数内对vector的修改没有应用到原来的vector上。 - 最后看了下别人的,都改为引用就过了
代码
class Solution
{
public:
bool leafSimilar(TreeNode * root1, TreeNode * root2) {
vector<int>list1;
vector<int>list2;
leaf(list1, root1);
leaf(list2, root2);
if (list1.size() == list2.size())
{
for (int i = 0; i < list1.size(); i++)
if (list1[i] != list2[i]) return false;
}
else
return false;
return true;
}
//寻找叶子结点并存值
void leaf(vector<int>& leafval,TreeNode* root)
{
if (root != NULL)
{
if (root->right == NULL && root->left == NULL)
leafval.push_back(root->val);
leaf(leafval, root->right);
leaf(leafval, root->left);
}
}
};
提交记录
第二个代码
class Solution {
public:
bool leafSimilar(TreeNode *root1, TreeNode *root2)
{
vector<int>list1;
vector<int>list2;
search(root1, list1);
search(root2, list2);
if (list1.size() != list2.size())
return false;
else {
for (int i = 0; i < list1.size(); i++) {
if (list1[i] != list2[i])
return false;
}
}
return true;
}
void search(TreeNode *now, vector<int> &list)
{
if (now==NULL)
return;
if (now->left == NULL && now->right == NULL)
list.push_back(now->val);
else {
if (now->left != NULL) {
search(now->left, list);
}
if (now->right != NULL) {
search(now->right, list);
}
}
}
};