当前位置: 首页 > 知识库问答 >
问题:

Zigzag方式打印二叉树的级序遍历

巫经义
2023-03-14

我必须使用层次顺序遍历打印二叉树的节点,但以螺旋形式,即不同层次的节点应该以螺旋形式打印。

例如:如果树看起来像:

输出应为 10 5 20 25 15 6 4。

我使用的算法很简单,只是级别顺序遍历的一个小变化。我只是取了一个变量p.if变量等于1,而不是从左到右打印给定级别的顺序,如果是-1,则从右到左打印。

void getlevel(struct node *root,int n,int p)
{
        if(root==NULL)
        return;
        if(n==0)
        {
                printf("%d ",root->info);
                return;
        }
        if(n>0)
        {
            if(p==1)
            {
                 getlevel(root->left,n-1,p);
                 getlevel(root->right,n-1,p);
            }
            if(p==-1)
            {
                 getlevel(root->right,n-1,p);
                 getlevel(root->left,n-1,p);
            }
        }
}

我得到了答案,但在歪斜树的情况下,最坏的情况复杂度可能是O(n^2)。

这个任务能有更好的算法吗?..

我的整个程序都在这里

共有3个答案

司马自明
2023-03-14

以下代码将完成此工作:

使用的语言:Java

//  Algorithm for printing nodes in Zigzag order(zigzag tree traversal)
static void zigzagTreeTraversal(Node root)
{
    int count=0,c=1,i=0;
    boolean odd=false;
    Queue<Node> queue=new LinkedList<Node>();
    Node temp = null;
    queue.add(root);
    System.out.print("Printing Tree Traversal in Zigzag form :");
    while(true)
    {
        if(queue.isEmpty())
        {
            break;
        }

        for(i=0;i<c;i++)
        {
            temp=queue.remove();
            System.out.print(", " + temp.data);
            if(odd)
            {
                if(temp.right!=null)
                {
                    queue.add(temp.right);
                    count++;
                }

                if(temp.left!=null)
                {
                    queue.add(temp.left);
                    count++;
                }

            }
            else
            {
                if(temp.left!=null)
                {
                    queue.add(temp.left);
                    count++;
                }
                if(temp.right!=null)
                {
                    queue.add(temp.right);
                    count++;
                }

            }
        }
        c=count;
        count=0;
        odd=!odd;
    }
}
姜经武
2023-03-14

二叉树螺旋级阶遍历的伪代码。

//Define two stacks S1, S2

//At each level,
// S1 carries the nodes to be traversed in that level
// S2 carries the child nodes of the nodes in S1

spiralLevelOrder(root) {
    S1 = new Stack()
    S2 = new Stack()
    S1.push(root)
    spiralLevelOrderRecursion(S1, S2, 1)
}

spiralLevelOrderRecursion(S1, S2, level) {
    while(S1 not empty) {
    node = S1.pop()
        visit(node)
        if (level is odd) {
            S2.push(node.rightNode)
            S2.push(node.leftNode)
        }
        else {
            S2.push(node.leftNode)
            S2.push(node.rightNode)
        }
    }
    if (S2 not empty)
        spiralLevelOrderRecursion(S2, S1, level+1)
}

示例树:1-(2-(4,5),3-(5,6))格式:root-(leftchild,rightchild)

应用伪代码:

螺旋级序递归([1], [], 1)

S2 - [] -> [3] -> [2, 3]
visit order : 1

螺旋级别顺序递归([2,3],[],2)

S2 - [] -> [4] -> [5,4] -> [6, 5, 4] -> [7, 6, 5, 4]
visit order : 2, 3

spirallevelordercursion([7,6,5,4],[],3)

visit order : 7, 6, 5, 4
杜俊远
2023-03-14

没问题.

您可以做一些类似于普通级别顺序遍历的事情。

你得用两叠

    < li >从左到右打印的第一叠 < li >从右向左打印的第二叠。

从根节点开始。将它的子元素存储在一个堆栈中。在每次迭代中,在其中一个堆栈中有一个级别的节点。打印节点,并将下一层节点压入另一个堆栈。重复,直到你达到最后的水平。

时间复杂性O(n)和空间复杂性O(n)。

 类似资料:
  • //执行顺序遍历的递归方法

  • 我试图使用队列的链表实现实现二叉搜索树的级别顺序遍历。 我已经检查了二叉查找树的实现,它是好的。队列的链表实现也是正确的。在这里,我试图访问节点并将其子节点排队。然后使用弹出函数实际访问节点。 这最终是通过递归调用完成的。当我运行以下代码时,我以不同的顺序获得输出。

  • 本文向大家介绍C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法,包括了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我想以以下方式打印我的二叉树: 我已经编写了用于插入节点的代码,但是无法编写用于打印树的代码。所以请帮忙。我的代码是: 问题答案: 您正在寻找的是广度优先遍历,它使您可以逐级遍历树。基本上,您使用队列来跟踪需要访问的节点,并在运行时将孩子添加到队列的 后面 (而不是将它们添加到堆栈的 前面 )。首先开始工作。 完成此操作后,您可以找出树具有()的级别,并使用该级别来估计空白。如果要使空

  • 问题内容: 首先,这个问题不是这个问题的重复,而是在此基础上建立的。 以该问题中的树为例, 您将如何修改程序以进行打印, 而不是一般 我基本上是在寻找最有效的方法的直觉- 我有一种方法,涉及将结果附加到列表中,然后遍历它。一种更有效的方法可能是在弹出每个级别时存储最后一个元素,然后再打印出新行。 有想法吗? 问题答案: 一次只建立一个级别,例如: 编辑 :如果您希望在最大消耗的“辅助”内存中节省少

  • 我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需