【树与二叉树】(二)二叉树的遍历

(二)二叉树的遍历

不熟悉< queue >用法,可以看看这篇博客:C++队列queue用法详解

强烈推荐课程:二叉树的层序遍历 二叉树的前中后序遍历

课程中印度的顶尖程序员Harsha Suryanarayana 详细讲解了递归在系统中怎么用栈实现的,受益匪浅。

一、广度优先-层序遍历

需要利用队列

1.1-创建一个简单的树

简单二叉树
#include <iostream>
#include <queue>
using namespace std;

//节点定义 
struct Node{
	int date;//数据域
	Node* left;//左指针
	Node* right;//右指针
	Node(int v):date(v),left(NULL),right(NULL){};//构造函数
}; 

//创建一个简单的树 
Node* Creat_An_BTree()
{
	Node* root = new Node(1);
	Node* n1 = new Node(2);
	Node* n2 = new Node(3);
	Node* n3 = new Node(4);
	Node* n4 = new Node(5);
	Node* n5 = new Node(6);
	Node* n6 = new Node(7);
	
	root->left = n1;
	root->right = n2;
	n1->left = n3;
	n1->right = n4;
	n2->left = n5;
	n2->right = n6;
	
	return root; 
}

int main()
{
	Node* root = Creat_An_BTree();
	return 0;
} 

虽然创建好了,但是我们没有现在没有函数能一次访问到所有节点

1.2-层序遍历思路

队列是一种 FIFO(First In First Out)数据结构

访问的顺序就是层序遍历的结果啦

层序遍历思路

1.3-层序遍历代码

void LevelOrderTraversal(Node* root)
{
	if(root==NULL)	return;
	queue<Node*> Q;
	Q.push(root);
	
	while(!Q.empty())
	{
		Node* cur = Q.front();
		cout << cur->date << " " << endl;
		if(cur->left!=NULL)		Q.push(cur->left);
		if(cur->right!=NULL)	Q.push(cur->right);
		Q.pop();
	}
}

二、深度优先-前中后序遍历

2.1-前中后序访问根节点顺序说明

左右节点的顺序不变

遍历方式访问顺序
前序根,左,右
中序左,根,右
后序左,右,根

2.2-前中后序遍历思路

使用递归,所谓的递归,就是系统自己调用了栈

在运行程序的过程中,系统把数据分成了四个区:

  1. 静态区:储存静态全局数据(static …)
  2. 栈区:储存调用函数中的数据(包括 main 函数)
  3. 堆区:程序运行中动态分配的数据(new/delete)
  4. 文本区:储存编译通过的二进制代码
递归的示意图

2.3-前中后序遍历代码

Node* & root–运用了引用

//前序遍历 
void PreOrderTraversal(Node* & root)
{
	if(root==NULL)	return;
	cout << root->date << " ";
	PreOrderTraversal(root->left); 
	PreOrderTraversal(root->right); 
}
//中序遍历 
void InOrderTraversal(Node* & root)
{
	if(root==NULL)	return;
	InOrderTraversal(root->left);
	cout << root->date << " ";
	InOrderTraversal(root->right); 
}
//先序遍历 
void OutOrderTraversal(Node* & root)
{
	if(root==NULL)	return;
	OutOrderTraversal(root->left); 
	OutOrderTraversal(root->right); 
	cout << root->date << " ";
}

三、全部代码

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

//节点定义 
struct Node{
	int date;
	Node* left;
	Node* right;
	Node(int v):date(v),left(NULL),right(NULL){};
}; 

//创建一个简单的树 
Node* Creat_An_BTree()
{
	Node* root = new Node(1);
	Node* n1 = new Node(2);
	Node* n2 = new Node(3);
	Node* n3 = new Node(4);
	Node* n4 = new Node(5);
	Node* n5 = new Node(6);
	Node* n6 = new Node(7);
	
	root->left = n1;
	root->right = n2;
	n1->left = n3;
	n1->right = n4;
	n2->left = n5;
	n2->right = n6;
	
	return root; 
}

void LevelOrderTraversal(Node* root)
{
	if(root==NULL)	return;
	queue<Node*> Q;
	Q.push(root);
	
	while(!Q.empty())
	{
		Node* cur = Q.front();
		cout << cur->date << " ";
		if(cur->left!=NULL)		Q.push(cur->left);
		if(cur->right!=NULL)	Q.push(cur->right);
		Q.pop();
//		cout << "Q是否为空:" << Q.empty() << endl;	
//		cout << "Q元素个数:" << Q.size() << endl;	
	}
}

//前序遍历 
void PreOrderTraversal(Node* & root)
{
	if(root==NULL)	return;
	cout << root->date << " ";
	PreOrderTraversal(root->left); 
	PreOrderTraversal(root->right); 
}
//中序遍历 
void InOrderTraversal(Node* & root)
{
	if(root==NULL)	return;
	InOrderTraversal(root->left);
	cout << root->date << " ";
	InOrderTraversal(root->right); 
}
//后序遍历 
void OutOrderTraversal(Node* & root)
{
	if(root==NULL)	return;
	OutOrderTraversal(root->left); 
	OutOrderTraversal(root->right); 
	cout << root->date << " ";
}
int main()
{
	Node* root = Creat_An_BTree();
	
	cout << "层序遍历:";
	LevelOrderTraversal(root);
	cout<< endl; 
	
	cout << "先序遍历:";
	PreOrderTraversal(root); 
	cout << endl; 
	
	cout << "中序遍历:";
	InOrderTraversal(root);
	cout << endl; 
	
	cout << "后序遍历:";
	OutOrderTraversal(root);
	cout << endl; 

	return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值