之字形树遍历

Posted

技术标签:

【中文标题】之字形树遍历【英文标题】:ZigZag Tree Traversal 【发布时间】:2020-09-08 10:20:04 【问题描述】:

给定一棵二叉树。找到二叉树的锯齿形级别顺序遍历。 你的任务: 您不需要读取输入或打印任何内容。您的任务是完成函数 zigZagTraversal(),该函数将二叉树的根节点作为其输入,并返回一个包含节点值的列表,因为它们出现在树的 Zig-Zag Level-Order Traversal 中。 例如:对于下面的二叉树,之字形顺序遍历将是 1 3 2 7 6 5 4. 二叉树示例enter image description here 输入: 3 / 2 1 输出:3 1 2

我的代码显示分段错误

   enter code here
vector <int> zigZagTraversal(Node* root)

    // Code here
    if(root==0)
    
        return 0;
    
    stack<Node *> s1;
    stack<Node *> s2;
    vector<int> m;
    m.push_back(root->data);
    s1.push(root->left);
    s1.push(root->right);
    
    
    while(s1.empty()==false || s2.empty()==false)
    
        if(s1.empty()==false)
        
            while(s1.empty()==false)
            Node *f=s1.top();
                if(s1.top()->right!=0)
                
                    s2.push(f->right);
                
                if(s1.top()->left!=0)
                
                    s2.push(f->left);
                
                m.push_back(f->data);
                s1.pop();
            
        
        else if(s2.empty()==false)
        
            while(s2.empty()==false)
            
                if(s2.top()->left!=0)
                Node *f=s2.top();
                    s1.push(f->left);
                
                if(s2.top()->right!=0)
                Node *f=s2.top();
                    s1.push(f->right);
                
               Node *f=s2.top();
                m.push_back(f->data);
                s2.pop();
            
        
    
    return m;

【问题讨论】:

【参考方案1】:
//hope this helps u
void zigZagTraversal(Node *root)

    int h=0;
    queue<pair<Node*,int>> q;
    Node *t;
    map<int,vector<int>> m;
    vector<int> v;
    q.push(root,h);
    while(!q.empty())
        t=q.front().first;
        h=q.front().second;
        q.pop();
        if(t)
            m[h].push_back(t->data);
            q.push(t->left,h+1);
            q.push(t->right,h+1);
        
    
    for(auto i=m.begin();i!=m.end();i++)
        v=m[i->first];
        if(!((i->first)%2))
            reverse(v.begin(),v.end());
        
        for(auto j=v.begin();j!=v.end();j++) cout<<*j<<" ";
    

【讨论】:

以上是关于之字形树遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树遍历必知方式

二叉树的之字形层序遍历

如何以之字形顺序遍历二维数组

有人能告诉我解决之字形遍历问题的时间复杂度吗[关闭]

java 103.二叉树之字形级别顺序遍历(BFS).java

java 103.二叉树之字形级别顺序遍历(BFS).java