二叉树的遍历

树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。

那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。

深度优先遍历
对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。

这三种遍历分别叫做先序遍历(preorder),中序遍历(midorder)和后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。

示意图

二叉树的遍历_第1张图片

 

主要有三种:

先(根)序遍历(根左右):A B D H E I C F J K G

中(根)序遍历(左根右) : D H B E I A J F K C G

后(根)序遍历(左右根) : H D I E B J K F G C A

使用递归算法进行遍历

/*      2022  03 23     */
//  1、了解基本组成   data  LChild  RChild
//  2、了解怎么去表示一棵树  根节点表示一棵树
//  3、了解二叉树的基本状态

/*   空的结构体指针  表示一颗NULL树  */

//   只有根节点的二叉树
//   只有左子树
//   只有右子树
//   左右子树都健全  分为完全二叉树 与满二叉树


#include
using namespace std;
struct  treeNode
{
	char data;  //  以  char  类型数据做分析
	struct treeNode *LChild;  //左子树
	struct treeNode *RChild;  //右子树

};

//1、创建树
struct  treeNode    *creatNode(char data)
{

	//动态  内存申请

	struct  treeNode* newNode = (struct  treeNode *)malloc(sizeof(struct  treeNode));

	newNode->data = data;
	newNode->LChild = NULL;
	newNode->RChild = NULL;
	return newNode;
}
//2、连接节点
//  根左右
void insertNodestruct(struct treeNode  *curNode ,struct treeNode *LChildNode, struct treeNode *RChildNode)
{
	curNode->LChild = LChildNode;
	curNode->RChild = RChildNode;
}

/*  打印  */

void  printData(struct treeNode* curNode)
{

	/*printf("%c\t", curNode->data);
	printf("\n");*/


	cout << curNode->data << "\t" ;
}







//3、遍历





//  递归中序遍历
//  左根右

void  midOrder(struct treeNode* tree)  //遍历树
{
	//递归算法可以简化代码,但是效率不高
	
	if (tree != NULL)
	{


		midOrder(tree->LChild);
		printData(tree);//左根右
		midOrder(tree->RChild);
	}
	
}


void  preOrder(struct treeNode* tree)  //遍历树
{
	//递归算法可以简化代码,但是效率不高

	if (tree != NULL)
	{

		printData(tree);
		preOrder(tree->LChild);
		preOrder(tree->RChild);
	}

}
void  postOrder(struct treeNode* tree)  //遍历树
{
	//递归算法可以简化代码,但是效率不高

	if (tree != NULL)
	{

		
		postOrder(tree->LChild);
		postOrder(tree->RChild);
		printData(tree);
	}

}

int main()
{

	//1、创建树
	struct treeNode *A = creatNode('A');
	struct treeNode *B = creatNode('B');
	struct treeNode *C = creatNode('C');
	struct treeNode *D = creatNode('D');
	struct treeNode *E = creatNode('E');
	struct treeNode *F = creatNode('F');
	struct treeNode *G = creatNode('G');
	struct treeNode *H = creatNode('H');
	struct treeNode *I = creatNode('I');
	struct treeNode *J = creatNode('J');
	struct treeNode *K = creatNode('K');



	//2、连接节点
	insertNodestruct(A, B, C);
	insertNodestruct(B, D, E);
	
	insertNodestruct(C, F, G);
	insertNodestruct(F, J, G);
	insertNodestruct(D, NULL, H);
	insertNodestruct(E, NULL, I);

	cout << "递归前序遍历:   ";
	preOrder(A);
	cout << endl;

	cout << "递归中序遍历:   ";
	midOrder(A);
	cout << endl;

	cout << "递归后序遍历:   ";
	postOrder(A);
	cout << endl;


	//3、遍历
	/*  注意遍历方式 : 前序  中序   后序  遍历   */
	/*   从左到右     注意根的位置  */

	system("pause");
	return 0;

}


















二叉树的遍历_第2张图片

你可能感兴趣的:(数据结构,c语言,visualstudio,c++)