二叉树的先序遍历的非递归算法

二叉树的先序遍历的非递归算法

直接上代码(用栈实现)

语言(c++)

#include <iostream>
#include "btree.h"
#include <stdio.h>
using namespace std;

int main()
{
BTNode *p,*q;
    char str[MaxSize],m;
    printf("\n(1)创建二叉树,请以括号表示法输入二叉树:\n");

    gets(str);
    CreateBTNode(p,str);

    printf("\n(2)输出二叉树:\n");
    DispBTNode(p);

    printf("\n(3)请输入要查找的结点:");
    scanf("%c",&m);
    q=FindNode(p,m);
    if(q->lchild==NULL)
    {
        printf("   无左孩子  ");
    }
     else
     {
         printf("  有左孩子  ");
     }
      if(q->rchild==NULL)
      {
          printf("  无右孩子  ");
      }
      else
      {
          printf("  有右孩子  ");
      }
    printf("\n(4)二叉树深度:%d\n",BTNodeDepth(p));

    printf("\n(5)先序遍历非递归算法结果:");
    DispBTNodeBefore(p);
    printf("\n(6)释放二叉树");
}

头文件:

#define MaxSize 100
typedef char ElemType;
typedef struct node
{
    ElemType data;              //数据元素
    struct node *lchild;        //指向左孩子
    struct node *rchild;        //指向右孩子
} BTNode;
typedef struct
{
    BTNode *data[MaxSize];
    int top;                //栈指针
} SqStack;

void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链
BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针
BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针
BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针
int BTNodeDepth(BTNode *b); //求二叉树b的深度
void DispBTNode(BTNode *b); //以括号表示法输出二叉树
void DestroyBTNode(BTNode *&b);  //销毁二叉树

void InitStack(SqStack *&s);    //初始化栈
void DestroyStack(SqStack *&s);  //销毁栈
bool StackEmpty(SqStack *s);     //栈是否为空
int StackLength(SqStack *s);  //返回栈中元素个数——栈长度
bool Push(SqStack *&s,BTNode * e); //入栈
bool Pop(SqStack *&s,BTNode * &e); //出栈
bool GetTop(SqStack *s,BTNode * &e); //取栈顶数据元素
void DispStack(SqStack *s);  //输出栈

void DispBTNodeBefore(BTNode *b);//先序遍历非递归

源文件:

#include <stdio.h>
#include <malloc.h>
#include "btree.h"

void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链
{
   BTNode *St[MaxSize],*p;
   int top=-1,k,j=0;
   char ch;
   b=NULL;
   ch=str[j];
   while(ch!='\0')
   {
       switch(ch)
       {
           case '(':top++;St[top]=p;k=1;break;
           case ')':top--;break;
           case ',':k=2;break;
           default:p=(BTNode *)malloc(sizeof(BTNode));
           p->data=ch;
           p->lchild=p->rchild=NULL;
           if(b==NULL)
           {
               b=p;
           }
           else
           {
               switch(k)
               {
                   case 1:St[top]->lchild=p;break;
                   case 2:St[top]->rchild=p;break;
               }
           }
       }
       j++;
       ch=str[j];
   }

   printf("创建成功!\n");

}
BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针
{
    BTNode *p;
    if (b==NULL)
        return NULL;
    else if (b->data==x)
        return b;
    else
    {
        p=FindNode(b->lchild,x);
        if (p!=NULL)
            return p;
        else
            return FindNode(b->rchild,x);
    }
}
BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针
{
    return p->lchild;
}
BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针
{
    return p->rchild;
}
int BTNodeDepth(BTNode *b)  //求二叉树b的深度
{
    int lchilddep,rchilddep;
    if (b==NULL)
        return(0);                          //空树的高度为0
    else
    {
        lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep
        rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep
        return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);
    }
}
void DispBTNode(BTNode *b)  //以括号表示法输出二叉树
{
    if (b!=NULL)
    {
        printf("%c",b->data);
        if (b->lchild!=NULL || b->rchild!=NULL)
        {
            printf("(");
            DispBTNode(b->lchild);
            if (b->rchild!=NULL) printf(",");
            DispBTNode(b->rchild);
            printf(")");
        }
    }

}
void DestroyBTNode(BTNode *&b)   //销毁二叉树
{
    if (b!=NULL)
    {
        DestroyBTNode(b->lchild);
        DestroyBTNode(b->rchild);
        free(b);
    }
}
void DispBTNodeBefore(BTNode *b){
    BTNode *p;
    SqStack *st;
    InitStack(st);
    if(b!=NULL){
        Push(st,b);
        while(!StackEmpty(st)){
            Pop(st,p);
            printf("%c ",p->data);
            if(p->rchild!=NULL){
                Push(st,p->rchild);
            }
            if(p->lchild!=NULL){
                Push(st,p->lchild);
            }
        }
    }
    DestroyStack(st);

}


void InitStack(SqStack *&s)
{
    s=(SqStack *)malloc(sizeof(SqStack));
    s->top=-1;
}
void DestroyStack(SqStack *&s)
{
    free(s);
}
int StackLength(SqStack *s)  //返回栈中元素个数——栈长度
{
    return(s->top+1);
}
bool StackEmpty(SqStack *s)
{
    return(s->top==-1);
}
bool Push(SqStack *&s,BTNode * e)
{

  if(s->top==MaxSize-1){
        return false;
    }else{

        s->top=s->top+1;
        s->data[s->top]=e;
        return true;
    }

}
bool Pop(SqStack *&s,BTNode * &e)
{


    e=s->data[s->top];
        s->top=s->top-1;

        if(StackEmpty(s)){
            return false;
        }else{
             return true;
        }

}
bool GetTop(SqStack *s,BTNode * &e)
{
    if (s->top==-1)         //栈为空的情况,即栈下溢出
        return false;
    e=s->data[s->top];
    return true;
}

点个赞吧,哈哈哈

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值