重新复习,这道题想复杂了……

一开始想到的是层次遍历二叉树,然后用迭代器正反迭代匹配一下,有一个不匹配就返回false。

忘了写中间为空时填充一个nullptr,导致有些案例也返回了true。

又发现如果找不到就填充nullptr,会导致队列永远不会为空,内存溢出MLE的情况,试图在匹配过程中发现空指针,就erase掉,但是迭代过程中erase会导致后续的所有迭代器前移

并且,erase反向迭代器需要进行一下显示类型转换,并在erase时转换成正向迭代器(++it_r).base()。

因为我是new了一个ptr来替代nullptr来实现普遍性,考虑到智能指针可能可以省力,但是实际情况下,似乎容器中不能添加智能指针。虽然我用shared_ptr.get()传递进了容器,但是这样猜测应该是违背容器管理的。

一个容器全部被erase后,迭代器得到的并不是end(),所以需要添加一个empty的判断条件

但是,我又发现,在erase最后一个,之后得到的是地址的顺推,但是end()因为在队列中被释放了2次,所以得到的是原本的倒数第二个,与实际不相符合了。所以需要添加一个计数器来管理结束

看了下参考答案,原来是在遍历的时候就直接正反遍历,最后直接匹配树就好了,我想复杂了。

不过也是成功实现了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
* 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 isSymmetric(TreeNode* root) {
deque<TreeNode*> stack_;
TreeNode* curr = root;

if(curr)
stack_.push_back(curr);

int level = 2;
int curr_level = 0;

shared_ptr<TreeNode> ptr_null(new TreeNode(0));
while(!stack_.empty())
{
//cout << curr->val << endl;
curr = stack_.front();
stack_.pop_front();

if(curr->left)
{
stack_.push_back(curr->left);
}else
{
stack_.push_back(ptr_null.get());
}

if(curr->right)
{
stack_.push_back(curr->right);
}else
{
stack_.push_back(ptr_null.get());
}
curr_level += 2;

cout << curr_level << ' '<<level << endl;
for(deque<TreeNode*>::iterator it_t = stack_.begin(); it_t != stack_.end(); it_t++)
cout << (*it_t)->val << ' ';
cout << endl;

if(level == curr_level)
{
curr_level = 0;
deque<TreeNode*>::iterator it;

// for(it = stack_.begin(); it != stack_.end(); it++)
// cout << (*it)->val << "";
// cout << endl;

int cnt = 0;
deque<TreeNode*>::reverse_iterator it_r;
int temp_lv = level/2;
for(it = stack_.begin(), it_r = stack_.rbegin();\
cnt < temp_lv; cnt++)
{
// cout << cnt << ' '<< level/4 <<endl;
// for(deque<TreeNode*>::iterator it_t = stack_.begin(); it_t != stack_.end(); it_t++)
// cout << (*it_t)->val << "";
// cout << endl;

if((*it) == ptr_null.get() && ptr_null.get() == (*it_r))
{
it = stack_.erase(it);
it_r = deque<TreeNode*>::reverse_iterator(stack_.erase(next(it_r).base()));
level -= 2;
continue;
}

if((*it)->val == (*it_r)->val)
{
cout << cnt << ' '<<temp_lv << endl;

cout << (*it)->val << " " << *it << " "<< (*it_r)->val << " " << *it_r << endl;
it++;
it_r++;
continue;
}
else
{
cout << cnt << ' '<< temp_lv << endl;
cout << (*it)->val << " " << *it << " "<< (*it_r)->val << " " << *it_r << endl;
return false;
}
}
level *= 2;
}
}
return true;
}


};