我正在尝试尝试二叉树的zig zag遍历。但我陷入了一种测试案例,即当树不平衡时。如果我将输入作为
const resBody = '{"foo":"bar", "objs":[{"name":"John", "income": 78787878977987787897897897123456786747398}]}';
const resBodyReplaced = resBody.replace(/: *(\d+)/g, ':"$1"');
console.log(JSON.parse(resBodyReplaced).objs[0].income);
表示如下所示的二叉树:
3
3 9 20 null null 15 7
我得到输出:
3
/ \
9 20
/ \
15 7
如果我的输入是3 9 20 1 null 15 7,我的输出是: 3 20 9 1 0
3
20 9
0
根据我的理解,如果输入为null,我的代码应该不返回任何内容并继续执行其他节点。我无法弄清楚我的错误。有谁能够帮我? TIA!
答案 0 :(得分:0)
您的代码实际上似乎与您提供的测试用例一起使用。我怀疑你的问题是输入/输出。然而,遗憾的是解决方案本身并非如此。请考虑以下测试用例:
1
/ \
5 2
/ \
6 3
/ \
7 4
您的解决方案将输出:[[1],[5,2],[6,3],[7,4]]
让我们将之字形向量中的每个向量称为一个级别。
我认为这种方法很难找到正确的解决方案。主要是因为它具有DFS性质。 BFS解决方案可能是正确的道路。它自然适合这些逐级风格的问题。
答案 1 :(得分:0)
对于级别顺序遍历,您可以使用堆栈数据结构以之字形方式遍历每个级别。
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;
}
保持第一个堆栈为奇数级,第二个堆栈为偶数级。遍历奇数水平时,先推左孩子,然后推右,而遍历偶数水平时,先推右孩子,然后推左。