我必须使用层次顺序遍历打印二叉树的节点,但以螺旋形式,即不同层次的节点应该以螺旋形式打印。
例如:如果树看起来像:
输出应为 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)。
这个任务能有更好的算法吗?..
我的整个程序都在这里
以下代码将完成此工作:
使用的语言: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;
}
}
二叉树螺旋级阶遍历的伪代码。
//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
没问题.
您可以做一些类似于普通级别顺序遍历的事情。
你得用两叠
从根节点开始。将它的子元素存储在一个堆栈中。在每次迭代中,在其中一个堆栈中有一个级别的节点。打印节点,并将下一层节点压入另一个堆栈。重复,直到你达到最后的水平。
时间复杂性O(n)和空间复杂性O(n)。
//执行顺序遍历的递归方法
我试图使用队列的链表实现实现二叉搜索树的级别顺序遍历。 我已经检查了二叉查找树的实现,它是好的。队列的链表实现也是正确的。在这里,我试图访问节点并将其子节点排队。然后使用弹出函数实际访问节点。 这最终是通过递归调用完成的。当我运行以下代码时,我以不同的顺序获得输出。
本文向大家介绍C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法,包括了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。
问题内容: 我想以以下方式打印我的二叉树: 我已经编写了用于插入节点的代码,但是无法编写用于打印树的代码。所以请帮忙。我的代码是: 问题答案: 您正在寻找的是广度优先遍历,它使您可以逐级遍历树。基本上,您使用队列来跟踪需要访问的节点,并在运行时将孩子添加到队列的 后面 (而不是将它们添加到堆栈的 前面 )。首先开始工作。 完成此操作后,您可以找出树具有()的级别,并使用该级别来估计空白。如果要使空
问题内容: 首先,这个问题不是这个问题的重复,而是在此基础上建立的。 以该问题中的树为例, 您将如何修改程序以进行打印, 而不是一般 我基本上是在寻找最有效的方法的直觉- 我有一种方法,涉及将结果附加到列表中,然后遍历它。一种更有效的方法可能是在弹出每个级别时存储最后一个元素,然后再打印出新行。 有想法吗? 问题答案: 一次只建立一个级别,例如: 编辑 :如果您希望在最大消耗的“辅助”内存中节省少
我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需