图解二叉树的遍历

本文深入解析二叉树的中序遍历方法,通过递归实现,详细阐述了遍历过程,即先遍历左子树,访问根节点,再遍历右子树。递归代码展示了这一逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的遍历可分为 前序遍历、中序遍历和后序遍历。要想写出正确的遍历,首先要清楚它们的遍历方式。博主过一段时间会弄混它们的遍历方式,后来总结出了一个规律,再也不会弄混了:
1)遍历中的前,中,后都指的是根结点;
2)左右子结点都是先左后右;
记住这 两点,就再也不怕混 乱了, 不信,你往博文下面看看图解

下面将依次介绍树的前、中、后序遍历的递归和非递归的方法:
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问 根结点,然后遍历左子树,最后遍历右子树。 二叉树 为空则结束返回,否则: (1)访问根结点。 (2)前序遍历左子树 (3)前序遍历右子树 。

递归代码:

void preOrder1(Bintree *root){
	if (root != NULL)
	{
		cout << root->data;
		preOrder(root->lchild);
		preOrder(root->rchild);
	}
}
循环代码

</pre><p></p><pre code_snippet_id="1641138" snippet_file_name="blog_20160925_3_4867777" name="code" class="cpp">void preOrder2(Bintree *root){  
	stack<Bintree*>  s;  
	Bintree *p = root;  
	while(p != NULL || !s.empty()){  
		while(p != NULL){  
			cout << p->data << " ";  
			s.push(p);  
			p = p->lchild;  
		}  
		if (!s.empty())  
		{  
			p=s.top();  
			s.pop();  
			p= p->rchild;
		}
	}
}

 

       中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树。即:二叉树为空则结束返回

否则:
(1)中序遍历左子树。 (2)访问根结点。 (3)中序遍历右子树。

递归代码为:

void midOrder1(Bintree *root){
	while (root != NULL)
	{
		midOrder1(root->lchild);
		cout << root->data << " ";
		midOrder1(root->rchild);
	}
}

循环的代码:

void midOrder2(Bintree *root){
	stack<Bintree*> s;
	Bintree *p = root;
	while(p != NULL || !s.empty()){
		while(p != NULL){
			s.push(p);
			p = p->lchild;
		}
		if (!s.empty())
		{
			p = s.top();
			cout << p->data << " ";
			s.pop();
			p = p->rchild;
		}
	}
}

      后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。即:

二叉树为空则结束返回,
否则:
(1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点

递归代码:

void lastOrder1(Bintree *root){
	while(root != NULL){
		lastOrder1(root->lchild);
		lastOrder1(root->rchild);
		cout << root->data;
	}
}

循环代码:

void lastOrder2(Bintree *root){
	//stack<Bintree*> s;
	stack< pair<Bintree*, bool> > s; 
	Bintree *p = root;
	//s.push(make_pair(root, true));

	while(p != NULL){
		s.push(make_pair(p, true));
		p = p->lchild;
	}
	if(!s.empty()){
		p = s.top().first;
		bool flag = s.top().second; 
		if (flag)
		{
			s.top().second = false;
			s.push(make_pair(p->rchild, true));

		}
		else
		{
			cout << p->data << " ";
			s.pop();
		}
	}
}

void lastOrder2(Bintree *root){  
	//stack<Bintree*> s;  
	stack< pair<Bintree*, bool> > s;   
	Bintree *p = root;  
	//s.push(make_pair(root, true));  

	while(p != NULL){  
		s.push(make_pair(p, true));  
		p = p->lchild;  
	}  
	if(!s.empty()){  
		
		p = s.top().first;
		bool flag = s.top().second;   
		s.pop();
		if (flag)  
		{  
			s.push(make_pair(p, flase));  
			p = p->rchild;	  

		}  
		else  
		{  
			cout << p->data << " ";  
			p = NULL;
		}  
	}  
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值