二叉树的层次遍历

一句话总结:用队列,先进先出。


#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;

typedef struct Node
{
	char val;
	struct Node *pLeftChild;
	struct Node *pRigthChild;
}TreeNode, *Tree;

//按照前序遍历方式插入元素生成树
int createTree(Tree &node)
{
	char c = getchar();
	cout << "node:" << c <<endl;
	if ('*' == c)
	{
		node = NULL;
		cout << "return end" <<endl;
		return -1;
	}
	else
	{
		//根左右,前序方式生成
		cout << "create root node" << endl;
		node = new Node();
		node->val = c;
		cout << "create left node" << endl;
		createTree(node->pLeftChild);
		cout << "create right node" << endl;
		createTree(node->pRigthChild);
	}
	return 0;
}


int levelPrint(Tree node)
{
	queue<Node *> q;
	if (NULL == node)
	{
		return 0;
	}
	if (q.empty())
	{
		q.push(node);
	}

	int queueSize = q.size();
	while (queueSize > 0)
	{
		cout << "queueSize: " << queueSize << endl;
		while (queueSize > 0)
		{
			Node *pNode = q.front();
			q.pop();
			cout << pNode->val << " " <<endl;
			if (pNode->pLeftChild != NULL)
			{
				q.push(pNode->pLeftChild);
			}
			if (pNode->pRigthChild != NULL)
			{
				q.push(pNode->pRigthChild);
			}
			--queueSize;
		}
		queueSize = q.size();
	}
	return 0;
}



int main(int argc, char const *argv[])
{
	Tree node; 
	createTree(node); //入参是指针引用,仅传指针node还是NULL
	levelPrint(node);
	return 0;
}


          1

      2       5

  3     4 

zjydeMacBook-Pro:~ zjy$ ./tree 

123**4**5**

node:1

create new node

create left node

node:2

create new node

create left node

node:3

create new node

create left node

node:*

return end

create right node

node:*

return end

create right node

node:4

create new node

create left node

node:*

return end

create right node

node:*

return end

create right node

node:5

create new node

create left node

node:*

return end

create right node

node:*

return end

node is not NULL

queueSize: 1

queueSize: 2

queueSize: 2

4



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值