在C ++中使用ZigZag二叉树遍历

时间:2018-05-26 06:40:59

标签: c++ tree binary-tree tree-traversal zigzag

我正在尝试尝试二叉树的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!

2 个答案:

答案 0 :(得分:0)

您的代码实际上似乎与您提供的测试用例一起使用。我怀疑你的问题是输入/输出。然而,遗憾的是解决方案本身并非如此。请考虑以下测试用例:

      1
     / \
    5   2
   /     \
  6       3
 /         \
7           4

您的解决方案将输出:[[1],[5,2],[6,3],[7,4]]

让我们将之字形向量中的每个向量称为一个级别。

  1. 首先将1(根)添加到第一级。
  2. k == 1级== 1然后你向左递归。
  3. k == 0 level == 2您将6正确添加到2级。然后再向左递归。
  4. k == 1 level == 3无法向左或向右递归。将7错误地添加到第3级。返回
  5. k == 0 level == 2无法正确递归。回报率。
  6. k == 1 level == 1将5错误地添加到1级。向右递归。
  7. 我认为这种方法很难找到正确的解决方案。主要是因为它具有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;

}

保持第一个堆栈为奇数级,第二个堆栈为偶数级。遍历奇数水平时,先推左孩子,然后推右,而遍历偶数水平时,先推右孩子,然后推左。