【问题标题】:ZigZag binary tree traversal in C++C ++中的ZigZag二叉树遍历
【发布时间】:2018-05-26 06:40:59
【问题描述】:

我正在尝试对二叉树进行曲折遍历。但是我被困在一种类型的测试用例中,即当树不平衡时。如果我输入为

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;
 }

据我了解,如果输入为 null,我的代码不应返回任何内容并继续执行其他节点。我无法弄清楚我的错误。有谁能够帮我? 蒂亚!

【问题讨论】:

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


    【解决方案1】:

    您的代码实际上似乎适用于您提供的测试用例。我怀疑您的问题与输入/输出有关。然而,不幸的是,解决方案本身并非如此。考虑以下测试用例:

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

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

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

    1. 首先将 1(根)添加到第一级。
    2. k==1 level==1 然后你向左递归。
    3. k==0 level==2 您将 6 正确添加到级别 2。然后再次向左递归。
    4. k==1 级别==3 不能向左或向右递归。将 7 错误地添加到第 3 级。返回
    5. k==0 级别==2 不能正确递归。返回。
    6. k==1 级别==1 错误地将 5 加到级别 1。向右递归。

    我认为这种方法很难找到正确的解决方案。主要是因为它的 DFS 性质。 BFS 解决方案可能是正确的道路。它自然适合这些逐级样式的问题。

    【讨论】:

    • 另外,我使用了映射,它不允许存储 NULL 值(或键),这是问题之一。谢谢:)
    【解决方案2】:

    对于级别顺序遍历,您可以使用堆栈数据结构以之字形方式遍历每个级别。

    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;
    
    }
    

    为奇数级保留第一个堆栈,为偶数级保留第二个堆栈。遍历奇数层时先推左子,再右子,遍历偶数层时先遍历右子,再左。

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多