数据结构之二叉树的逻辑结构和遍历

二叉树的顺序存储:

前提: 是完全二叉树
在这里插入图片描述问题: 用一块连续的存储单元(数组)存储节点元素,怎么才能体现树的逻辑结构呢(怎么体现1是23的双亲节点,23是1的孩子节点)?
答: 利用了完全二叉树的性质,可以通过数组下标找到某个节点的双亲节点或孩子节点。(2节点的孩子节点是数组下标为4和5的节点)
在这里插入图片描述问题: 非完全二叉树怎么实现顺序存储呢?
答: 将非完全二叉树补成完全二叉树即可,将补上去的节点数组对应位置置0。
在这里插入图片描述

二叉树的顺序存储的缺点:

会浪费大量的存储空间,这种存储方式比较适合完全二叉树
在这里插入图片描述

二叉树的链式存储(常):

在这里插入图片描述
问题: 空指针域与非空指针域的关系
在这里插入图片描述

二叉树链式的代码定义:

typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

二叉树的遍历方法:

先序遍历:

在这里插入图片描述
递归实现:

void PreOrder(BiTree T){
	if(T != NULL){
		visit(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
} 

栈的实现:

中序遍历:

在这里插入图片描述
递归实现:

void InOrder(BiTree T){
	if(T != NULL){
		PreOrder(T->lchild);
		visit(T);
		PreOrder(T->rchild);
	}
} 

栈的实现:
在这里插入图片描述

//初始时依次扫描根节点的所有左侧节点并入栈
//出栈一个节点,访问该节点
//扫描该节点的右孩子节点并入栈
//依次扫描右孩子节点的所有左侧节点并入栈
//反复该过程直到栈空为止
void InOrder(BiTree T){
	InitStack(S);
	BiTree p = T;
	while(p != NULL || IsEmpty(S)){
		if(p != NULL){
			Push(S,p);
			p = p->lchild;
		}
		else{
			Pop(S,p);
			visit(p);
			p = p->rchild;
		}
	}
} 

后序遍历:

在这里插入图片描述
递归实现:

void PostOrder(BiTree T){
	if(T != NULL){
		PreOrder(T->lchild);
		PreOrder(T->rchild);
		visit(T);
	}
} 

层次遍历:

在这里插入图片描述

//初始时将根入队并访问根节点,然后出队
//若有左子树,则将左子树的根入队
//若有右子树,则将右子树的根入队
//然后出队,访问该节点
//反复该过程直到队列空为止
void LevelOrder(BiTree T){
	InitQueue(Q);
	BiTree p;
	EnQueue(Q,T);
	while(!isEmpty(Q)){
		DeQueue(Q,p);
		visit(p);
		if(p->lchild != NULL)
			EnQueue(Q,p->lchild);
		if(p->rchild != NULL)
			EnQueue(Q,p->rchild);
	}
}

遍历序列转二叉树:

先序遍历序列+中序遍历序列:

在这里插入图片描述

在这里插入图片描述

后序遍历序列+中序遍历序列:

层次遍历序列+中序遍历序列:

ps: 后序遍历序列+前序遍历序列不能唯一确定一颗二叉树

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值