C++ 中的 ZigZag 二叉树遍历
ZigZag binary tree traversal in C++
我正在尝试对二叉树进行之字形遍历。但是我被困在一种类型的测试用例中,即当树不平衡时。如果我输入
3
3 9 20 null null 15 7
对于看起来像这样的二叉树:
3
/ \
9 20
/ \
15 7
我得到输出:
3
20 9
0
如果我的输入是 3 9 20 1 null 15 7,我的输出是:
3个
20 9
1 0
下面是我的代码。
struct node
{
int data;
node* left;
node* right;
};
void order (node* root, map <int, vector <int> >& ans, int level, int k) {
if (root == NULL) {
return;
}
if (k==0) {
if (root->left != NULL) {
ans[level+1].push_back(root->left->data);
order (root->left, ans, level+1, 1);
}
if (root->right != NULL) {
ans[level+1].push_back(root->right->data);
order (root->right, ans, level+1, 1);
}
}
else if (k==1) {
order (root->left, ans, level+1, 0);
order (root->right, ans, level+1, 0);
if (root->right != NULL)
ans[level+1].push_back(root->right->data);
if (root->left != NULL)
ans[level+1].push_back(root->left->data);
}
}
vector<vector<int> > zigzag(node* root){
map <int, vector <int> > ans;
vector <vector <int> > zig;
ans[0].push_back(root->data);
order(root, ans, 1, 1);
for (auto it = ans.begin(); it != ans.end(); it++ ) { //converting map into vector
zig.push_back(it->second);
}
return zig;
}
据我了解,如果输入为空,我的代码应该 return 什么都不应该继续执行其他节点。我无法弄清楚我的错误。有谁能够帮助我?
TIA!
您的代码实际上似乎适用于您提供的测试用例。我怀疑你的问题是 input/output。然而不幸的是,解决方案本身不是。考虑以下测试用例:
1
/ \
5 2
/ \
6 3
/ \
7 4
您的解决方案将输出:[[1], [5, 2], [6, 3], [7, 4]]
让我们将之字形向量中的每个向量称为一个级别。
- 首先,您将 1(根)添加到您的第一级。
- k==1 level==1 然后你向左递归。
- k==0 level==2 你正确地将6加到level 2。然后再次向左递归。
- k==1 level==3 不能左右递归。错误地将 7 添加到级别 3。Return
- k==0 level==2 无法正确递归。 Return.
- k==1 level==1 level 1加5错误,向右递归。
- 等等
我认为这种方法很难得到正确的解决方案。主要是因为它的 DFS 性质。 BFS 解决方案可能是正确的路径。它自然适合这些逐级风格的问题。
对于级别顺序遍历,您可以使用堆栈数据结构以之字形方式遍历每个级别。
vector<vector<int> > Solution::zigzagLevelOrder(TreeNode* root) {
stack<TreeNode*> s1, s2;
s1.push(root);
vector< vector< int> > ans;
int check = 1;
while(!s1.empty() or !s2.empty()){
vector<int> current;
if(check){
while(!s1.empty()){
root = s1.top();
s1.pop();
current.push_back(root->val);
if(root->left)
s2.push(root->left);
if(root->right)
s2.push(root->right);
}
check = 1 - check;
}
else{
while(!s2.empty()){
root = s2.top();
s2.pop();
current.push_back(root->val);
if(root->right)
s1.push(root->right);
if(root->left)
s1.push(root->left);
}
check = 1 - check;
}
ans.push_back(current);
}
return ans;
}
保持第一个栈为奇数层,第二个栈为偶数层。遍历奇数层时先推左子再右,遍历偶数层时先遍历右子再左
我正在尝试对二叉树进行之字形遍历。但是我被困在一种类型的测试用例中,即当树不平衡时。如果我输入
3
3 9 20 null null 15 7
对于看起来像这样的二叉树:
3
/ \
9 20
/ \
15 7
我得到输出:
3
20 9
0
如果我的输入是 3 9 20 1 null 15 7,我的输出是: 3个 20 9 1 0
下面是我的代码。
struct node
{
int data;
node* left;
node* right;
};
void order (node* root, map <int, vector <int> >& ans, int level, int k) {
if (root == NULL) {
return;
}
if (k==0) {
if (root->left != NULL) {
ans[level+1].push_back(root->left->data);
order (root->left, ans, level+1, 1);
}
if (root->right != NULL) {
ans[level+1].push_back(root->right->data);
order (root->right, ans, level+1, 1);
}
}
else if (k==1) {
order (root->left, ans, level+1, 0);
order (root->right, ans, level+1, 0);
if (root->right != NULL)
ans[level+1].push_back(root->right->data);
if (root->left != NULL)
ans[level+1].push_back(root->left->data);
}
}
vector<vector<int> > zigzag(node* root){
map <int, vector <int> > ans;
vector <vector <int> > zig;
ans[0].push_back(root->data);
order(root, ans, 1, 1);
for (auto it = ans.begin(); it != ans.end(); it++ ) { //converting map into vector
zig.push_back(it->second);
}
return zig;
}
据我了解,如果输入为空,我的代码应该 return 什么都不应该继续执行其他节点。我无法弄清楚我的错误。有谁能够帮助我? TIA!
您的代码实际上似乎适用于您提供的测试用例。我怀疑你的问题是 input/output。然而不幸的是,解决方案本身不是。考虑以下测试用例:
1
/ \
5 2
/ \
6 3
/ \
7 4
您的解决方案将输出:[[1], [5, 2], [6, 3], [7, 4]]
让我们将之字形向量中的每个向量称为一个级别。
- 首先,您将 1(根)添加到您的第一级。
- k==1 level==1 然后你向左递归。
- k==0 level==2 你正确地将6加到level 2。然后再次向左递归。
- k==1 level==3 不能左右递归。错误地将 7 添加到级别 3。Return
- k==0 level==2 无法正确递归。 Return.
- k==1 level==1 level 1加5错误,向右递归。
- 等等
我认为这种方法很难得到正确的解决方案。主要是因为它的 DFS 性质。 BFS 解决方案可能是正确的路径。它自然适合这些逐级风格的问题。
对于级别顺序遍历,您可以使用堆栈数据结构以之字形方式遍历每个级别。
vector<vector<int> > Solution::zigzagLevelOrder(TreeNode* root) {
stack<TreeNode*> s1, s2;
s1.push(root);
vector< vector< int> > ans;
int check = 1;
while(!s1.empty() or !s2.empty()){
vector<int> current;
if(check){
while(!s1.empty()){
root = s1.top();
s1.pop();
current.push_back(root->val);
if(root->left)
s2.push(root->left);
if(root->right)
s2.push(root->right);
}
check = 1 - check;
}
else{
while(!s2.empty()){
root = s2.top();
s2.pop();
current.push_back(root->val);
if(root->right)
s1.push(root->right);
if(root->left)
s1.push(root->left);
}
check = 1 - check;
}
ans.push_back(current);
}
return ans;
}
保持第一个栈为奇数层,第二个栈为偶数层。遍历奇数层时先推左子再右,遍历偶数层时先遍历右子再左