拔丝芋头的数据结构复习日记---Day4、5---二叉树的储存和遍历

< 今日知识点 >

  • 二叉树及存储结构
  • 二叉树的遍历

·
·
·

—01 二叉树及存储结构

1、二叉树的几个重要性质

在这里插入图片描述
在这里插入图片描述
·
2、二叉树的存储结构

  • 顺序存储结构

在这里插入图片描述

  • 完全二叉树使用顺序存储方式在查找上是十分方便的,任意一个儿子节点想要寻找它的父节点,只需用儿子节点的下标÷2 取整即可。
  • 一般的二叉树也可以使用顺序存储方式存储节点,但是若想要方便查找,就需要空出空的节点位置,造成空间浪费。
  • 链表存储

代码实现:

typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
	ElementType Data;
	BinTree left;
	BinTree right;
};

·
·
·

—02 二叉树的遍历
1、二叉树的递归遍历

以前序遍历为例:

  • 访问根节点
  • 先序遍历其左子树
  • 先序遍历其右子树

先序遍历代码实现:

void PreOrderTraversal(BinTree T)
{
	if(BT){
		printf("%d",BT->Data);
		PreOrderTraversal(BT->left);
		PreOrderTraversal(BT->right);
	}
}

中序遍历代码实现:

void InOrderTraversal(BinTree T)
{
	if(BT){
		InOrderTraversal(BT->left);
		printf("%d",BT->Data);
		InOrderTraversal(BT->right);
	}
}

后序遍历代码实现:

void PostOrderTraversal(BinTree BT)
{
	if(BT){
		PostOrderTraversal(BT->left);
		PostOrderTraversal(BT->right);
		printf("%d",BT->Data);
	}
}
  • 先序、中序、后序遍历过程:遍历过程中经过节点的路线一样,只是访问各节点的时机不同。先序遍历是第一次遇到该节点时访问,中序是第二次遇到该节点时访问,而后序是第三次。
    在这里插入图片描述

·

2、二叉树的非递归遍历

(1)先序遍历

void preorder(bitree *t)//前序遍历的非递归算法
{
 	bitree *temp = t;//定义一个树节点,用它来遍历
 	while(temp != NULL || s.top != 0)
 	{
  		while(temp != NULL)//先遍历左孩子,并输出。
  		{
   			printf("%4d",temp->data);
   			push(temp);
 		  	temp = temp->lchild;
 		 }
  		if(s.top != 0)//当左孩子遍历完后,取栈顶,找右孩子。此时循环还没有结束,再遍历它的左孩子,直至孩子全部遍历结束。
  		{
   			temp = pop();
   			temp = temp->rchild;
		  }
 		}
 		printf("\n");
}

(2)中序遍历

void inorder(bitree *t)//中序遍历的非递归算法
{
 	bitree *temp = t;
 	while(temp != NULL||s.top != 0)
 	{
  		while(temp != NULL)//先把左孩子入栈,所有左孩子入栈结束
  		{
   			push(temp);
   			temp = temp->lchild;
 		 }
 		 if(s.top != 0)//左孩子入栈结束,取栈顶,输出栈顶元素,遍历右孩子
 		 {
  			 temp = pop();
  			 printf("%4d",temp->data);
  			 temp = temp->rchild;
 		 }
	}
 	printf("\n");
}

(3)后序遍历

void laorder (BinTree T)
{
	BinTree temp = T;
	while (temp != NULL || s.top != NULL)
	{
		temp->number=1; //当前节点首次被访问
		push(temp);
		temp = temp->Left;
	}
	if(s.top != NULL)
	{
		temp=pop();  //栈顶出栈
		if(temp->number == 1)  //第一次出现在栈顶
		{
			temp->number++;
			push(temp);  //重新入栈
			temp=temp->Right;  //指向右子树
		} else if(temp->number ==2){
			printf("%4d",temp->Data);
			temp = NULL;  //置空,防止陷入死循环
		}
	   }
      }
}

(4)层序遍历

void LevelOrderTraversal(BinTree BT)
{
	Queue Q;
	BinTree T;

	if(!BT) return; //若是空树则直接返回
	
	Q = CreateQueue();
	AddQ(Q,BT);
	while(!IsEmpty(Q)) 
	{
		T = DeleteQ(Q);
		printf("%d",T->Data);    //访问出队节点
		if(T->Left)
			AddQ(Q,T->Left);
		if(T->Right)
		        AddQ(Q,T->Right);
	}
}

·
·
·
·
·
·
附:文章中所有ppt图片均来自 中国大学mooc 浙江大学《数据结构》课程!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值