二叉树的顺序存储
#difine MaxSize 100
struct TreeNode
{
int data;//结电值
bool isEmpty;//结点是否为空
} ;
适合完全二叉树,若不是完全二叉树,也要把树中节点与完全二叉树对应
i的
左孩子 2i;
右孩子:2i+1
父节点:i/2向下取整
2i<n 有左孩子
二叉树的链式存储
typedef struct BiTNode
{
int data;
struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
//定义一颗空树
BiTree root=Null;
//插入根节点
root =(BiTree)mizeof(sizeof(BiTNode));
root->data=1;
root->lchild=NULL;
root->rchild=Null;
先序遍历
void PreOrder(BiTree T)
{
if(T!=NULL)
{
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
中序(LNR)
void InOrder(BiTree T)
{
if(T!=NULL)
{
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
后序
void PostOrder(BiTree T)
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
中序遍历的非递归形式
//思想:一直向左走,走到空出栈并访问,若有右孩子入栈,若没有出栈并访问
void InOrder(BiTree T)
{
InitStack(S)//初始化栈S
BiTree p=T;//遍历
while(p||IsEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;//一直向左走
}
else
{
POP(S,p);visit(p);//出栈并访问
p=p->rchild;
}
}
}
先序的非递归形式
void InOrder(BiTree T)
{
InitStack(S)//初始化栈S
BiTree p=T;//遍历
while(p||IsEmpty(S))
{
if(p)
{
visit(p);
Push(S,p);
p=p->lchild;//一直向左走
}
else
{
POP(S,p);
p=p->rchild;
}
}
}
后序的非递归形式
void PostOrder(BiTree T)
{
BiTree p=T,r=NULL;
InitStack(S);
while(p||IsEmpty(S)){
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
GetTop(S,p);//读取栈顶元素
if(p->rchild&p->rchild!=r)//P有右子树且右子树未被访问
{
p-p->rchild;
}
else
{
Pop(S,p);
visit(p);
r=p;//记录最近访问过的节点
p=NULL;
}
}
}
}
层次遍历
void LevelOrder(BiTree T)
{
InitQueue(q);//初始化队列
BiTree p=T;
Push(q,p);
while(IsEmpty(q))
{
Pop(q,p);
visit(p);
if(p->lchild) Push(q,p->lchild);
if(p->rchild) Push(q,p->rchild);
}
}