数据结构-二叉树

这篇博客探讨了二叉树数据结构的核心——遍历算法,阐述了如何通过遍历解决二叉树相关问题。

二叉树相关算法

主要牵扯遍历,其他都可以通过遍历变形得到。

#include <stdio.h>
#include<stdlib.h>
//二叉树
typedef struct Node
{
    int data;
    Node *lchild,*rchild;
} BTNode,*BTTree;
//线索二叉树
typedef struct ThreadNode
{
    int data;
    ThreadNode *lchild,*rchild;
	int ltag,rtag;
} ThreadNode,*ThreadTree;
//三叉链表表示二叉树
typedef struct TNode
{
    int data;
    TNode *lchild,*rchild,*parent;
} TNode,*TTree;
//二叉平衡树AVL
typedef struct AVLNode
{
    int data;
    AVLNode *lchild,*rchild;
	int bf;
} AVLNode,*AVLTree;
//先序创建
void PreCreateBTTree(BTTree&T,char flag)
{
	printf("%c child(-1 EOF):",flag);
	int n;
	scanf("%d",&n);
	if(n==-1)T=NULL;
	else
	{
		T=(BTTree)malloc(sizeof(BTNode));
		T->lchild=T->rchild=NULL;
		T->data=n;
		PreCreateBTTree(T->lchild,'L');
		PreCreateBTTree(T->rchild,'R');
	}
}

//访问
void Visit(BTTree T)
{
	printf("%d ",T->data);
}
//先序递归
void PreVisit(BTTree T)
{
	if(T)
	{
		Visit(T);
		PreVisit(T->lchild);
		PreVisit(T->rchild);
	}
}
//中序递归
void InOrderVisit(BTTree T)
{
	if(T)
	{
		InOrderVisit(T->lchild);
		Visit(T);
		InOrderVisit(T->rchild);
	}
}
//后序递归
void PostVisit(BTTree T)
{
	if(T)
	{
		PostVisit(T->lchild);
		PostVisit(T->rchild);
		Visit(T);
	}
}
//先序非递归
void NPreVisit(BTTree T)
{
	BTNode* Stack[1000],*p=T;//假设节点数少于1000
	int top=0;
	while(p||top>0)
	{
		if(p)
		{
			Stack[top++]=p;
			Visit(p);
			p=p->lchild;
		}
		else
		{
			p=Stack[--top];
			p=p->rchild;
		}
	}
}
//中序非递归
void NInOrderVisit(BTTree T)
{
	BTNode* Stack[1000],*p=T;//假设节点数少于1000
	int top=0;
	while(p||top>0)
	{
		if(p)
		{
			Stack[top++]=p;
			p=p->lchild;
		}
		else
		{
			p=Stack[--top];
			Visit(p);
			p=p->rchild;
		}
	}
}
//后序非递归
void NPostVisit(BTTree T)
{
	BTNode* Stack[1000],*p=T;//假设节点数少于1000
	BTNode* pre=NULL;//刚刚访问过的节点
	int top=0;
	while(p||top>0)
	{
		if(p)
		{
			Stack[top++]=p;
			p=p->lchild;
		}
		else
		{
			p=Stack[--top];
			if(p->rchild&&p->rchild!=pre)//右子树存在且不是刚访问的
			{
				Stack[top++]=p;
				p=p->rchild;
			}
			else
			{
				Visit(p);
				pre=p;
				p=NULL;
			}
		}
	}
}
//层序遍历
void LevelOrder(BTTree T)
{
	BTNode*Queue[1000];//假设节点数少于1000
	int front=0,rear=0;
	BTNode*p=T;
	if(p)
	{
		Queue[rear++]=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值