层序遍历及其进阶版

输入为:abd##eh###cfi##j##g##

1、普通层序遍历:输出为一行

2、进阶版1:输出每一层,从左向右依次输出

3、进阶版2:S型输出每一层,即从右向左和从左向右交替输出

#include<iostream>
#include<vector>
using namespace std;

template<class T>
struct BiNode
{
    T data;
	BiNode<T>* leftchild,*rightchild;
}; 

template<class T>
class BiTree
{
public:
    BiTree();
	BiNode<T>* GetRoot();
	void PreOrder(BiNode<T>* node);
    void LevelOrder1(BiNode<T>* node);//层次遍历
	void LevelOrder2(BiNode<T>* node);//高级版层序遍历
	void LevelOrder3(BiNode<T>* node);//螺旋版层序遍历
private:
    BiNode<T>* m_root;
    BiNode<T>* Create();
};
template<class T>
BiNode<T>* BiTree<T>::GetRoot()
{
    return m_root;
}  

template<class T>
BiTree<T>::BiTree()
{
    m_root = new BiNode<T>;
    m_root = Create();  

}
template<class T>
BiNode<T>* BiTree<T>::Create()
{
    char ch;
    cin>>ch;
    BiNode<T>* pnode;
    if (ch == '#')
        pnode = NULL;
    else
    {
        pnode = new BiNode<T>;
        pnode->data = ch;
        pnode->leftchild = Create();
        pnode->rightchild = Create();
    }
    return pnode;
}
/*template<class T>
void BiTree<T>::PreOrder(BiNode<T>*R){
	if(R){
		cout<<R->data<<' ';
		PreOrder(R->leftchild);
		PreOrder(R->rightchild);
	}
}*/
template<class T>
void BiTree<T>::LevelOrder1(BiNode<T>* R){//普通版
	BiNode<T> * queue[100];
	BiNode<T> * p;
	int f=0,r=0;
	if(R)
		queue[++r]=R;
	while(f!=r){
		p=queue[++f];
		cout<<p->data;
		if(p->leftchild)
			queue[++r]=p->leftchild;
		if(p->rightchild)
			queue[++r]=p->rightchild;
	}
}
template<class T>
void BiTree<T>::LevelOrder2(BiNode<T>* R){//进阶版1
	if(R){
		vector<BiNode<T> *> vec;
		vec.push_back(R);
		int f=0,r=1;
		while(f<vec.size()){
			r=vec.size();
			while(f<r){
				cout<<vec[f]->data<<' ';
				if(vec[f]->leftchild)
					vec.push_back(vec[f]->leftchild);
				if(vec[f]->rightchild)
					vec.push_back(vec[f]->rightchild);
				f++;
			}
			cout<<endl;
		}
	}
}
template<class T>
void BiTree<T>::LevelOrder3(BiNode<T>* R){//进阶版2
	if(R){
		vector<BiNode<T> *> vec;
		vec.push_back(R);
		int f=0,r=1,s=1;
		int check=0;
		while(f<vec.size()){
			r=vec.size();
			check=1-check;
			int r1=r;
			while(f<r1){
				if(check){
					cout<<vec[f]->data<<' ';
					if(vec[r-1]->rightchild){
						vec.push_back(vec[r-1]->rightchild);}
					if(vec[r-1]->leftchild){
						vec.push_back(vec[r-1]->leftchild);}
					f++;
					r--;}
				else{
					cout<<vec[f]->data<<' ';
					if(vec[r-1]->leftchild){
						vec.push_back(vec[r-1]->leftchild);}
					if(vec[r-1]->rightchild){
						vec.push_back(vec[r-1]->rightchild);}
					f++;
					r--;
				}
			}
			cout<<endl;
		}
	}
}

int main()
{
    BiTree<char> mtree;
	//cout<<"PreOrder:"<<endl;
	BiNode<char> *root=mtree.GetRoot();
	//mtree.PreOrder(root);
	cout<<"LevelOrder:"<<endl;
	mtree.LevelOrder3(root);
	system("pause");
	return 0;
}  
时间: 2024-11-17 19:41:58

层序遍历及其进阶版的相关文章

java集合框架小结(进阶版)之HashMap篇

基本概念: Hash(哈希):hash一般也译作“散列”.事实上,就是一个函数,用于直接定址.将数据元素的关键字key作为变量,通过哈希函数,计算生成该元素的存储地址. 冲突:函数是可以多对一的.即:多个自变量可以映射到同一函数值.一般而言,不同的key的hash值是不同的.在往hash表中映射的时候,不同的hash值可能映射到同一存储地址,这种情况被称为冲突. 解决冲突的方法: 1. 链表法:将冲突的各个元素用一个一维数组来维护.(java源码实现) 2. 开发寻址法:具体的有线性探测法.二次

逗比之——程序员装逼手册2(进阶版)

1. 着装 一根牛X的程序员是根本没有时间打理自己外貌的,发型就要像爱因斯坦一样,顶着一脑袋鸡窝,凌乱蓬松美,给人随时能从头发里掏出一个鸡蛋的感觉.胡子一大把,彰显自信又从容,不近视则以,近视就要戴酒瓶底子那么厚的大眼镜,一种科研工作者的风格.牛X程序员对自己着装是有高要求的,无论是春夏秋冬,白天晚上,刮风下雨,一个牛X的程序员都要十分在意自己着装,T恤+大花裤衩子+拖鞋是标配,一年365天风雨无阻.换衣服保持一年3-5件T恤的更新频率就可以,T恤大多是参见开源大会免费获得的,上面印着ruby

【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

[107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example

二叉树的层序遍历

二叉树层序遍历即从上往下.自左而右地访问每个节点,但按这样的顺序的话,相邻访问的两个节点间大多没有直接联系,不易访问,所以会显得比较麻烦,不过我们有队列这个好东西,建一个顺序表队列,里面按顺序存入每个节点的地址,之后在队列中按顺序访问就行了.关键是用队列到底能不能恰好地把每一个节点按从上往下.自左而右的顺序存储起来呢?请看如下分析. local表示当前访问的节点在队列中的位置,length表示队列的长度.local=0时在访问A,此时可把B.C加入队列,length=3:当local=1访问B时

LeetCode OJ:Binary Tree Level Order Traversal(二叉树的层序遍历)

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example:Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ] 层序遍历,既

二叉树层序遍历的实现

我们可以很容易的使用队列来实现二叉树的层序遍历,代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAX 10 4 5 6 //二叉树存储结构定义 7 typedef char Item; 8 typedef struct node *link; 9 struct node {Item item; link l, r;}; 10 11 int Create(link *tp); 12 void show(link

java集合框架小结(进阶版)之HashSet篇

建议先看下:java集合框架小结(进阶版)之HashMap篇 基本概念: hashSet: 根据java集合框架小结(初级版)图示,HashSet是AbstractSet的一个子类,是基于Hash算法的Set接口的实现,顾名思义.允许添加null. --------------------------------------↑ 以上都是扯淡 ↑,↓ HashSet完全是在挂羊头卖狗肉 ↓------------------------------------------- 何谓挂羊头卖狗肉?大家

编程之美问题之二叉树层序遍历多种解法

二叉树的层序遍历(要求区分层,例如每层遍历完输出换行) 单单层序遍历非常简单,一个队列就搞定了,但是区分层则要麻烦些.总的思路无非就是在每次print的时候,要能通过某个东西 区分出当前节点是否是一层最后一个节点,或者下一层的最后一个节点,感觉有点类似于机器学习中找个区分度明显的特征: 1.自己的解法,在单队列基础上,输入队列的数据添加一个标志 ,LevelHeaded,同时,在后面插入两个孩子的时候,判断是否这次输出的是队头,如果是的话,先插 个队头标志,再插入孩子,而且插入一次之后,后面不能

Java实现二叉树的前序、中序、后序、层序遍历(递归方法)

public class Tree<AnyType extends Comparable<? super AnyType>> { private static class BinaryNode<AnyType> {BinaryNode(AnyType theElement) { this(theElement, null, null); } BinaryNode(AnyType theElement, BinaryNode<AnyType> lt, Bina