二叉树相关算法
主要牵扯遍历,其他都可以通过遍历变形得到。
#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++]=

这篇博客探讨了二叉树数据结构的核心——遍历算法,阐述了如何通过遍历解决二叉树相关问题。
最低0.47元/天 解锁文章
1202

被折叠的 条评论
为什么被折叠?



