当前位置 : 主页 > 编程语言 > c语言 >

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

来源:互联网 收集:自由互联 发布时间:2023-09-03
前序、中序以及后序遍历 学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次

 

前序、中序以及后序遍历


        学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历 是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。

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

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

按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:

        1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。

        2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。

        3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后

        由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

        

// 二叉树前序遍历
void PreOrder(BTNode* root);
// 二叉树中序遍历
void InOrder(BTNode* root);
// 二叉树后序遍历
void PostOrder(BTNode* root);

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

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

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

 下面主要分析前序递归遍历,中序与后序图解类似,同学们可自己动手绘制。

前序遍历

        前序遍历递归图解:

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

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

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

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

        代码解析:

                

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return;
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

BTNode* CreatTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);
	BTNode* node7 = BuyNode(7);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node2->right = NULL;
	node4->left = node5;
	node4->right = node6;

	return node1;
}


//前序排列
void PreOrder(BTNode* root)
{
	if (root==NULL)
	{
		printf("NULL ");
		return;
	}

	printf("%d ",root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}


int main()
{
	BTNode* root = CreatTree();
	PreOrder(root);
	printf("\n");
	return 0;
}

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

中序遍历

          中序遍历递归图解:

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

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

        代码解析:

        

void InOrder(BTNode* root) {
	if (root == NULL) {
		printf("NULL ");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

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

后序遍历

        后序遍历递归图解:

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

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

        代码解析:

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);
}

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



【感谢龙石为本站提供数据api平台http://www.longshidata.com/pages/exchange.html】
上一篇:poj-1328
下一篇:没有了
网友评论