您的位置:首页 > 编程语言 > C语言/C++

树的遍历

2015-10-30 20:49 441 查看
包含树的前序遍历、中序遍历、后序遍历和层次遍历,提供了递归和非递归方法:
/*****递归***/
void PreOrder(BiTree T){
if (NULL != T)
{
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}

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

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

/*****非递归***/

void InOrder(BiTree T){
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 PreOrder(BiTree T){
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){
p = T;
preNode = NULL; //指向前一个被访问的节点
while(p || !IsEmpty(s)){
while(p){ //一直往左走直至为空
Push(S,p);
p = p->lchild;
}
Pop(S,p);
if (NULL == p->rchild || preNode == p->rchild) //若左右子树都为空或左子树为空,而右子树已经被访问,则访问当前节点
{
visit(p);
preNode = p;
p = NULL;
}else{
p = p->rchild;
}
}
}
void LevelOrder(BiTree T){
InitQuere(Q);
BiTree p;
EnQueue(Q, T);
while (!IsEmpty(Q)){
DeQueue(Q,p);
visit(p);
if (NULL != p->lchild)
EnQueue(Q,p->lchild);
if (NULL != p->rchild)
EnQueue(Q,p->rchild);
}
}
int Btdepth(BiTree T){ //求树的深度
if (NULL == T)
return 0;
ldep = Btdepth(T->lchild);
rdep = Btdepth(T->rchild);
return ldep > rdep ? ldep+1 : rdep +1; //从叶子节点每次返回加1
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息