看数据结构写代码(24) 二叉链表的递归遍历 和 非递归遍历 算法 总结

本文介绍了二叉链表遍历的重要性,包括先序、中序、后序和层序遍历。讨论了递归算法的简单性和效率问题,以及非递归算法的高效性。讲解了非递归先序和中序遍历的实现思路,包括如何利用栈和队列来访问节点,确保正确的顺序。
摘要由CSDN通过智能技术生成

二叉链表的 遍历 是 二叉链表 各种 操作的 基础,例如 :创建 二叉树;求树的 长度;求树的 叶子节点数;求 节点的 层 数;求 树的 深度,宽度 等等。

总之 不掌握 遍历,就没有 掌握 二叉树;

二叉链表的 遍历 根据 根节点的访问顺序有:先(根节点)序,中(根节点)序,后(根节点)序, 和 层序;

算法思路 有两类:

1. 递归 算法,算法 清晰,容易 证明算法的正确性,但是 效率较低 和 受 系统 栈区 大小的限制,不能 递归太多层次

2.非 递归算法,算法 较复杂一些,但是效率高,又 不受 栈区大小的限制

下面 讲解 这两种 算法:

1.递归算法 ,递归没什么 说的,比较 简单

//递归算法 先序
void preOrderTraverse(Tree tree){
	if (tree != NULL)
	{
		printf("%d\t",tree->data);
		preOrderTraverse(tree->leftChild);
		preOrderTraverse(tree->rightChild);
	}
}
//递归算法 中序
void inOrderTraverse(Tree tree){
	if (tree != NULL)
	{
		inOrderTraverse(tree->leftChild);
		printf("%d\t",tree->data);
		inOrderTraverse(tree->rightChild);
	}
}
//递归算法 后序
void postOrderTraverse(Tree tree){
	if (tree != NULL)
	{
		postOrderTraverse(tree->leftChild);
		postOrderTraverse(tree->rightChild);
		printf("%d\t",tree->data);
	}
}


2.重点 讲解 非 递归算法,非递归 算法 需要 借助 栈 (先,中,后序) 或者 队列(层序) 来进行遍历。

2.1 非递归 先序 算法 总共 有 三种 方法:

 下面 的两种算法 思路一致,都是 找左子树最左下角节点的同时访问节点,然后 将 节点的 右子树入栈。然后 重复寻找..

void preOrderTraverse1(Tree t){
	linkStack stack;
	stackInit(&stack);
	stackPush(&stack,t);
	while (!stackEmpty(stack))
	{
		while (stackGetTop(stack,&t) && t)
		{
			printf("%d\t",t->data);
			stackPush(&stack,t->leftChild);
		}
		stackPop(&stack,&t);//NULL 出栈
		if (!stackEmpty(stack))
		{
			stackPop(&stack,&t);
			stackPush(&stack,t->rightChild);
		}
	}
	stackDestory(&stack);
}

void preOrderTraverse2(Tree tree){
	linkStack stack;
	stackInit(&stack);
	while (tree || !stackEmpty(stack))
	{
		if (tree)
		{
			printf("%d\t",tree->data);
			stackPush(&stack,tree);
			tree = tree->leftChild;
		}
		else
		{
			stackPop(&stack,&tree);
			tree = tree->rightChild;
		}
	}
	stackDestory(&stack);
}
第三种 思路 较 前两种 清晰,更加 易懂

1.空树 不操作 2.将 树根入栈 3.访问  根 节点 ,将根节点出栈 4. 右子树不为空,将 右子树 入栈 5. 左子树 不为空,将左子树入栈 6.重复 3~ 5 步

比较 奇思妙想的是 先 将 右子树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值