二叉树的前序、中序、后续、层序遍历

二叉树的特性与遍历
本文深入探讨了二叉树的基本概念及其性质,包括非空二叉树的层数与元素数量关系,满二叉树与完全二叉树的特点,以及二叉树的前序、中序、后序和层序遍历算法实现。

二叉树的基本概念
每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。
性质:
1、非空二叉树的第n层上至多有2^(n-1)个元素。
2、深度为h的二叉树至多有2^h-1个结点。
3、满二叉树:所有终端都在同一层次,且非终端结点的度数为2。
4、在满二叉树中若其深度为h,则其所包含的结点数必为2^h-1。
5、完全二叉树:除了最大的层次即成为一颗满二叉树且层次最大那层所有的 结点均向左靠齐,即集中在左面的位置上,不能有空位置。
对于完全二叉树,设一个结点为i则其父节点为i/2,2i为左子节点,2i+1为右子节点。

前序遍历:中-左-右

void PreTraverTree(NodeBinaryTree *ps)//前序遍历
{
	if (ps != NULL)//当二叉树不为空时遍历
	{
		cout<<ps->data<<' ';
		if (ps->Left != NULL) PreTraverTree(ps->Left);
		if (ps->Right != NULL) PreTraverTree(ps->Right);
	}
}

中序遍历:左-中-右

void InTraverTree(NodeBinaryTree *ps)//中序遍历
{
	if (ps != NULL)
	{
		if (ps->Left != NULL) InTraverTree(ps->Left);
		cout << ps->data << ' ';
		if (ps->Right != NULL) InTraverTree(ps->Right);
	}
}

后序遍历:左-右-中

void EndTraverTree(NodeBinaryTree *ps)//后序遍历
{
	if (ps != NULL)
	{
		if (ps->Left != NULL) EndTraverTree(ps->Left);
		if (ps->Right != NULL) EndTraverTree(ps->Right);
		cout << ps->data << ' ';
	}
}

层序遍历:由上到下,由左到右

void SequeTraverTree(NodeBinaryTree *ps)//层序遍历
{
	queue<NodeBinaryTree *> q;
	if (ps)
		q.push(ps);
	while (q.empty()==false)
	{
		NodeBinaryTree *temp = q.front();//q.front()代表队列q的首个元素       //法一
		cout << temp->data << "->";
		q.pop();//出队列。每执行一次,最先进去队列的元素出队列,下个元素随即变成q.front()代表的元素
		if (temp->Left)
		{
			q.push(temp->Left);
		}
		if (temp->Right)
		{
			q.push(temp->Right);
		}
		//cout << q.front()->data << "->";//法二
		//if (q.front()->Left)
		//{
		//	q.push(q.front()->Left);
		//}
		//if (q.front()->Right)
		//{
		//	q.push(q.front()->Right);
		//}
		//q.pop();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值