螺旋遍历_螺旋形式的水平阶遍历

螺旋遍历

Problem statement:

问题陈述:

Write a program to print Level Order Traversal in spiral form of a binary tree.

编写一个程序以二叉树的螺旋形式打印Level Level Traversal

Example:

例:

Level order traversal in spiral form
For the above tree:
Basic level order traversal:
2
7 5
2 6 9
5 11 4
Level order traversal in spiral form:
2
7 5 (left to right)
9 6 2 (right to left)
5 11 4 (again left to right)

Solution:

解:

The solution will, of course, surround basic level order traversal. The spiral order means - It will go from left to right for one level, then right to left for next level and again left to right for the next one and so on.

当然,解决方案将围绕基本级别的顺序遍历 。 螺旋顺序表示-它将从左向右移动一个级别,然后从右向左移动到下一个级别,再从左向右移动到下一个级别,依此类推。

We need to modify our basic level order traversal.

我们需要修改基本的层级遍历 。

We can do the flipping of direction (left → right then right → left so on ...) by keeping a flag variable which will be updated at end of each level.

我们可以通过保持标记变量来进行方向翻转(左→右然后右→左等等),这将在每个级别的末尾进行更新。

Pre-requisite: Root to tree

先决条件:从树到根

1.  Declare flag as 1(true);
2.  Declare a queue q to store pointer to nodes(node*);
3.  Declare a stack s which helps us for flipping.
4.  Print the root as we are not going to bother about root level;
5.  IF(root->left) //left child exists
ENQUEUE(q, root->left);
END IF
IF(root->right) //right child exists
ENQUEUE(q, root->right);
END IF
IF root has no child
RETURN BACK //nothing to print more
ELSE
q.push(NULL); //to indicate end of 1st level
6.  //Here goes the modified level order traversal
When flag=1 its left-to right 
flag=0 its right to left
while (q is not empty){
temp=DEQUEUE(q);	
IF(temp==NULL) //end of last traversed level
IF (q is not empty)
ENQUEUE (q, NULL);
END IF
IF (flag==0)
Pop and print data from stack until stack is empty
END IF	
flag=1-flag; //flip flag for next level 1 to 0 or 0 to 1
ELSE
IF(flag == 1)
Print temp->data; //left to right printing		
ELSE
Push temp->data to stack s; //this makes right to left 
//printing as rightmost node will be at the top of stack
END IF-ELSE
// basic level order traversal (direction left to right)
IF(root->left) //left child exists
ENQUEUE(q, root->left);
END IF
IF (root->right) //right child exists
ENQUEUE(q, root->right);
END IF
END IF-ELSE (outer one)
END WHILE loop

Example with Explanation:

解释示例:

    For the above tree root is being printed 
first without any constraint
2
For the first level flag is 1
Thus it prints immediately while accessing temp node
7 5 (since basic traversal direction is always left to right)
At the end of level flag flips to 0
So while traversing instead of printing nodes at once, 
nodes get stored in stack
At the end of level all the nodes data being popped and printed.
In stack
9(top)
6
2
Thus printing
9 6 2 (right to left)
Flag again flipped to 1
Basic left to right printing
5 11 4
So the output is in spiral order

C++ implementation:

C ++实现:

#include <bits/stdc++.h>
using namespace std;
// tree node is defined
class Node{
public:
int data;
Node *left;
Node *right;
};
// creating new node
Node* newnode(int data)  
{ 
Node* node = (Node*)malloc(sizeof(Node)); 
node->data = data; 
node->left = NULL; 
node->right = NULL; 
return(node); 
} 
void printSpiral(Node *root)
{
Node* temp;
int flag=1;	
queue<Node*> q;
stack<int> s;
cout<<root->data<<"\n";
if(root->left)
q.push(root->left);
if(root->right)
q.push(root->right);
if(!root->left && !root->right)
return;
q.push(NULL);
while(!q.empty()){
temp=q.front();
q.pop();
if(temp==NULL){
if(!q.empty())
q.push(NULL);
if(flag==0){
while(!s.empty()){
cout<<s.top()<<" ";
s.pop();
}
}
flag=1-flag;
cout<<endl;
}
else{
if(flag){
cout<<temp->data<<" ";
}
else{
s.push(temp->data);
}
if(temp->left)
q.push(temp->left);
if(temp->right)
q.push(temp->right);
}
}
}
int main() { 
//**same tree is builted as shown in example**
Node *root=newnode(2); 
root->left= newnode(7); 
root->right= newnode(5); 
root->right->right=newnode(9);
root->right->right->left=newnode(4);
root->left->left=newnode(2); 
root->left->right=newnode(6);
root->left->right->left=newnode(5);
root->left->right->right=newnode(11);
cout<<"Level Order traversal in spiral form of ";
cout<<"the binary tree is :"<<endl; 
printSpiral(root); 
return 0; 
}

Output

输出量

Level Order traversal in spiral form of the binary tree is :
2
7 5
9 6 2
5 11 4

翻译自: https://www.includehelp.com/icp/level-order-traversal-in-spiral-form.aspx

螺旋遍历

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SharePoint2007安装图文详解二:安装AD(活动目录)及DNS

在上一篇SharePoint2007安装图文详解一&#xff1a;安装IIS及相关组件中已经介绍了IIS及相关组件的安装&#xff0c;本篇将详细介绍AD&#xff08;活动目录&#xff09;的安装。 打开“管理您的服务器”&#xff0c;点击“添加或删除角色” 点击“添加或删除角色”后弹出“配置…

php的foreach

作用&#xff1a;遍历数组 索引数组 形式&#xff1a;foreach(数组 as 值){ //操作 } <?phpheader(content-type:text/html;charsetutf-8);$personarray(DL_one,18,man);foreach($person as $chara){echo $chara,<br>;} ?>2. 关联数组 形式&#xff1a;foreach…

strcmp java_C语言中strcmp的实现原型

C语言中strcmp的实现原型实现代码&#xff1a;int __cdecl strcmp (const char * src,const char * dst){int ret 0 ;while( ! (ret *(unsigned char *)src - *(unsigned char *)dst) && *dst)src, dst;if ( ret < 0 )ret -1 ;else if ( ret > 0 )ret 1 ;ret…

带有Python示例的math.sin()方法

Python math.sin()方法 (Python math.sin() method) math.sin() method is a library method of math module, it is used to get the sine of the number in radians, it accepts a number returns the cosine of the given number in radians. math.sin()方法是数学模块的库方…

ExtJs实践(3)——xtype名称与控件对应

xtype可作为Ext控件的简写&#xff0c;都会对应一个Ext控件。当然这里你也可以自定义这个xtype&#xff0c;通过自定义的Ext控件来绑定&#xff0c;主要由Ext.reg方法去注册xtype。Ext.all.js里面包含的xtype包含&#xff1a; xtype Class ------------- -------…

fmax()函数以及C ++中的示例

C fmax()函数 (C fmax() function) fmax() function is a library function of cmath header, it is used to find the maximum value of the given numbers, it accepts two number and returns the larger one. fmax()函数是cmath标头的库函数&#xff0c;用于查找给定数字的…

java date传输类型错误_转换日期格式:Java中的转换错误?

我正在尝试将此日期转换为其他格式。不幸的是&#xff0c;他们成功地解析了日期并正确地保留了所有信息。06-Dec-2017 07&#xff1a;14&#xff1a;56.656PM至2017-12-06 19&#xff1a;14&#xff1a;56.656如果我尝试解析输入日期LocalDateTime.parse("06-Dec-2017 07:…

Linux 2440 LCD 控制器

嵌入式Linux之我行&#xff0c;主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验&#xff0c;二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处&#xff0c;谢请指正。共享资源&#xff0c;欢迎转载&#xff1a;http://hbhuanggang.cublog.cn 一、开…

python 示例_Python中带有示例的关键字除外

python 示例Python关键字除外 (Python except keyword) except is a keyword (case-sensitive) in python, it is used with try... except statement to handle the exception. 除了是python中的一个关键字(区分大小写)&#xff0c;它与try ... except语句一起使用来处理异常。…

java中使用es精准查询_使用ES简单查询语句须知

查询样例{"query": { //1"bool": { ///2"must": [{ //3"query_string": {"default_field": "xxxz","query": " *XXX* "}}],"should": [], //4"must_not": [], 5"fi…

php的create_function、function_exists判断函数是否存在

create_function 格式&#xff1a;create_function(‘参数’,‘函数体代码’) 作用&#xff1a;创建匿名函数 <?phpheader(content-type:text/html;charsetutf-8);$func create_function($a,$b, return ($a$b););echo $func(10,20); ?>function_exists 返回值为boo…

python中dict函数_dict()函数以及Python中的示例

python中dict函数Python dict()函数 (Python dict() function) dict() function is a library function, it is used to create a dictionary with keywords( Ids) and values (s), it accepts a set of values with keywords, values and returns a dictionary. dict()函数是…

最佳ASP.NET编程习惯

初学编程的朋友往往喜欢收集一些很“奇妙”的编程技巧&#xff0c;然而&#xff0c;技巧的积累往往并没有提高程序质量&#xff0c;反而引导一些编程者一味追求奇和新&#xff0c;忘记了基本编程习惯的培养&#xff0c;不利于团队的合作&#xff0c;可能&#xff0c;这也是中国…

php的传值与传址

默认情况下&#xff0c;函数的参数都表示是值传递&#xff0c;但是&#xff0c;如果在定义函数的参数前面加上取地址符&#xff0c;表示传递的是地址值 传值&#xff1a; <?phpheader(content-type:text/html;charsetutf-8);function changeValue($num){$num10;}$value5;c…

IBM System p5 服务器 HACMP 安装指南

一. 系统需求 1.1 硬件需求 IBM HACMP 支持所有 IBM System p5 服务器。 1.2 软件需求 1.2.1 AIX 与 RSCT 版本要求 AIX 5L Version RSCT Version RSCT Filesets AIX 5L Version 5.3 TL1 2.4.2 rsct.compat.basic.hacmp 2.4.2.0 rsct.compat.clients.hacmp 2.4.2.0 rsct.…

学java要学vue吗_学vue之前必看

Vue学习1.1 vue.js是什么&#xff1f;​ Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c…

python 全局_全局关键字,带Python示例

python 全局Python全局关键字 (Python global keyword) global is a keyword (case-sensitive) in python, it is used to declare a global variable inside a function (from a non-global scope). global是python中的一个关键字(区分大小写)&#xff0c;用于在函数内部声明…

php中函数的默认值,参数的顺序

形式参数可以在定义时候给参数赋一个默认值&#xff0c;默认值不能是一个变量&#xff0c;可以是常量&#xff0c;当调用函数时&#xff0c;如果没有参数&#xff0c;函数就会按照默认值处理&#xff0c;如果传递了参数&#xff0c;就按照传递的参数处理 <?phpheader(cont…

.NET Enterprise Services Performance

http://msdn.microsoft.com/library/default.asp?url/library/en-us/dncomser/html/entsvcperf.asp?frametrue Summary: See the performance of native COM and .NET Enterprise Services components when applied to different activation and calling patterns. Get guide…

10款精选的用于构建良好易用性网站的jQuery插件

这篇随笔收集了10款非常给力的jquery 插件&#xff0c;帮助你构建易用性良好的网站&#xff0c;希望对你有用&#xff01; Embedded help system 看过该插件demo后&#xff0c;感叹道&#xff0c;真是太棒了&#xff01; 点demo里的How to下面的几个链接看看效果:) Embedded …