【数据结构】二叉树的遍历

本文详细介绍了二叉树的三种遍历方式——先序、中序和后序,分别给出了递归和非递归的实现方法。对于非递归遍历,还探讨了使用栈辅助进行中序和后序遍历的优化策略。此外,文章还提出了一种新的非递归中序和后序遍历方法,通过节点计数来确定何时打印节点数据。
摘要由CSDN通过智能技术生成

一、递归遍历

二叉树结构:

typedef char Element;
//二叉链式树节点
typedef struct BtNode
{
	Element data;				//数据域
	struct BtNode* leftchild;	//左孩子
	struct BtNode* rightchild;	//右孩子
}BtNode, *BinaryTree;
(1)先序
//前序遍历二叉树
void PreOrder(BinaryTree root)
{
	if (root == NULL) return;
	cout << root->data << " ";
	PreOrder(root->leftchild);
	PreOrder(root->rightchild);
}

(2)中序
//中序遍历二叉树
void MidOrder(BinaryTree root)
{
	if (root == NULL) return;
	MidOrder(root->leftchild);
	cout << root->data << " ";
	MidOrder(root->rightchild);
}

(3)后序
//后序遍历二叉树
void LastOrder(BinaryTree root)
{
	if (root == NULL) return;
	LastOrder(root->leftchild);
	LastOrder(root->rightchild);
	cout << root->data << " ";
}

二、非递归遍历

二叉树结构:

typedef char Element;
//二叉链式树节点
typedef struct BtNode
{
	Element data;				//数据域
	struct BtNode* leftchild;	//左孩子
	struct BtNode* rightchild;	//右孩子
}BtNode, *BinaryTree;
(1)先序
//非递归先序遍历
void Pre(BtNode* p)
{
	if (NULL == p) return;
	stack<BtNode*> st;
	st.push(p);
	while (!st.empty())
	{
		p = st.top();
		st.pop();
		cout << p->data << " ";
		//先入后出
		if (p->rightchild != NULL)
		{
			st.push(p->rightchild);
		}
		if (p->leftchild != NULL)
		{
			st.push(p->leftchild);
		}

	}
	cout << endl;
}
(2)中序
//中序非递归遍历
void Mid(BtNode* p)
{
	if (NULL == p)
		return;

	stack<BtNode*> st;
	while (p != NULL || !st.empty())
	{
		while (p != NULL)
		{
			st.push(p);
			p = p->leftchild;
		}
		p = st.top();
		st.pop();
		cout << p->data << " ";
		p = p->rightchild;
	}
}
(3)后序
//后序非递归遍历
void Last(BtNode* p)
{
	if (NULL == p)
		return;
	stack<BtNode*> st;
	BtNode* tag = NULL;
	while (p != NULL || !st.empty())
	{
		while (p != NULL)
		{
			st.push(p);
			p = p->leftchild;
		}
		p = st.top();
		st.pop();
		if (p->rightchild == NULL || p->rightchild == tag)
		{
			cout << p->data << " ";
			tag = p;
			p = NULL;
		}
		else
		{
			st.push(p);
			p = p->rightchild;
		}
	}
}

三、其他结构遍历

二叉树结构:

typedef char Element;
//二叉链式树节点
typedef struct BtNode
{
	Element data;				//数据域
	struct BtNode* leftchild;	//左孩子
	struct BtNode* rightchild;	//右孩子
}BtNode, *BinaryTree;


struct JieBtNode
{
	BtNode* pnode;	//节点
	int count;		//记录出栈次数:1代表左 2代表中 3代表右
public:
	JieBtNode(BtNode* p) :pnode(p), count(0)
	{}
};
(1)非递归中序
//非递归中序遍历
void NewMid(BtNode* p)
{
	if (NULL == p) return;
	stack<JieBtNode> st;
	st.push(JieBtNode(p));

	while (!st.empty())
	{
		JieBtNode jienode = st.top();
		st.pop();
		if (++jienode.count == 2)
		{
			cout << jienode.pnode->data << " ";
			if (jienode.pnode->rightchild != NULL)
			{
				st.push(JieBtNode(jienode.pnode->rightchild));
			}
		}
		else
		{
			st.push(jienode);
			if (jienode.count == 1 && jienode.pnode->leftchild != NULL)
			{
				st.push(JieBtNode(jienode.pnode->leftchild));
			}
		}
	}
	cout << endl;
}
(2)非递归后序
//非递归后序遍历
void NewLast(BtNode* p)
{
	if (NULL == p) return;
	stack<JieBtNode> st;
	st.push(JieBtNode(p));

	while (!st.empty())
	{
		JieBtNode jienode = st.top();
		st.pop();
		if (++jienode.count == 3)
		{
			cout << jienode.pnode->data << " ";
		}
		else
		{
			st.push(jienode);
			if (jienode.count == 1 && jienode.pnode->leftchild != NULL)
			{
				st.push(JieBtNode(jienode.pnode->leftchild));
			}
			else if(jienode.count == 2 && jienode.pnode->rightchild != NULL)
			{
				st.push(JieBtNode(jienode.pnode->rightchild));
			}
		}
	}
	cout << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值