数据结构学习之——树的遍历(完整版)

树的遍历

第一次在这里写文章,记录一下这关于树的遍历的学习。
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

前序、中序、后序遍历

树的遍历有几种常用的方式:
在这里插入图片描述

先序遍历:

先访问根节点,再访问左子树,最后访问右子树。
A->B->D->F->E->C->G->H->I

中序遍历:

先访问左子树,再访问右子树,最后访问根节点。
D->B->E->F->A->G->H->C->I

后序遍历:

先访问左子树,再访问根节点,最后访问右子树。
D->E->F->B->H->G->I->C->A

采用递归的方式遍历

树的创建和结构体的定义:

//结构体长度声明
#define LEN_TREE  sizeof(struct TreeNode)
//树结构体
typedef struct TreeNode *Bintree;
//typedef Bintree Position;
typedef struct TreeNode {
	char data;
	Bintree left;
	Bintree right;
}TreeNode;
void MakeTree(struct TreeNode* root);               //创建二叉树
//递归遍历
void PreOrderTraversal(struct TreeNode* root);      
void InOrderTraversal(struct TreeNode* root);
void PostOrderTraversal(struct TreeNode* root);

先序遍历的递归实现:

//先序遍历 递归 ->A->B->D->F->E->C->G->H->I
void PreOrderTraversal(struct TreeNode* root) {
	if (root) {
		printf("->%c", root->data);
		PreOrderTraversal(root->left);
		PreOrderTraversal(root->right);
	}
}

中序遍历的递归实现:

//中序遍历 递归
void InOrderTraversal(struct TreeNode* root) {
	if (root) {
		InOrderTraversal(root->left);
		printf("->%c", root->data);
		InOrderTraversal(root->right);
	}
}

后序遍历的递归实现:

//后序遍历 递归
void PostOrderTraversal(struct TreeNode* root) {
	if (root) {
		PostOrderTraversal(root->left);
		PostOrderTraversal(root->right);
		printf("->%c", root->data);
	}
}

采用堆栈和队列(非递归)的遍历

队列出入栈定义:

//堆栈出入栈
void push(TreeNode *tree);
struct TreeNode * pop(void);
//队列出入列
void append(struct TreeNode* tree);
struct TreeNode* delet(void);

struct stack *top; //堆栈的顶端
struct link *head; //队列头
struct link *tail; //队列尾

先序遍历的堆栈实现:

//堆栈先序
void PreStcakTraversal(struct TreeNode* root) {
	struct TreeNode *T;
	T = (struct TreeNode*)malloc(LEN_TREE);
	T = root;
	while (T != NULL || top->next != NULL) {
		while (T != NULL) {
			printf("->%c", T->data);
			push(T);
			if (T->left != NULL)
				T = T->left;
			else
				T = NULL;
		}
		if (top->next != NULL) {
			T = pop();
			if (T->right != NULL)
				T = T->right;
			else
				T = NULL;
		}
	}
}

中序遍历的堆栈实现:

//堆栈中序
void InStcakTraversal(struct TreeNode* root) {
	struct TreeNode *T;
	T = (struct TreeNode*)malloc(LEN_TREE);
	T = root;
	while (T != NULL || top->next != NULL) {
		while (T != NULL) {
			push(T);
			if (T->left != NULL)
				T = T->left;
			else
				T = NULL;
		}
		if (top->next != NULL) {
			T = pop();
			printf("->%c", T->data);
			if (T->right != NULL)
				T = T->right;
			else
				T = NULL;
		}
	}
}

后序遍历的堆栈实现:

//堆栈后序
void PostStcakTraversal(struct TreeNode* root) {
	struct TreeNode *T;
	T = (struct TreeNode*)malloc(LEN_TREE);
	T = root;
	int i = 1;
	while (T != NULL || top->next != NULL) {
		while (T != NULL) {
			//printf("->%c", T->data);
			ls[i] = T->data;
			i++;
			push(T);
			if (T->right != NULL)
				T = T->right;
			else
				T = NULL;
		}
		if (top->next != NULL) {
			T = pop();
			if (T->left != NULL)
				T = T->left;
			else
				T = NULL;
		}
	}
	for (i--; i >= 1; i--) {
		printf("->%c", ls[i]);
	}
}

层序遍历的队列实现:

//队列层序遍历

void LayerLinkTraversal(struct TreeNode* root) {
	struct TreeNode* tree;
	append(root);
	while (tail->next != head) {
		tree = delet();
		printf("->%c", tree->data);
		if (tree->left) {
			append(tree->left);
		}
		if (tree->right) {
			append(tree->right);
		}
	}
}

参考文档

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值