【无标题】二叉树遍历(递归与非递归源码)

#include<stdio.h>

#include<stdlib.h>

#define MAX_LENTH 100

 

struct BITNODE

{

 int Date;

 struct BITNODE *LChild, *RChild;

 

}*BiTree;

 

void SetNull(BITNODE *bt)//设置一棵空二叉树,即置头节点的左右孩子链域为空

{

 bt->LChild = nullptr;

 bt->RChild = nullptr;

}

//创建一棵左右子树为空的二叉树,返回根节点地址

struct BITNODE *Create(int Date, struct BITNODE *LChild, struct BITNODE *RChild)

{

 BITNODE *p = (struct BITNODE*)malloc(sizeof(struct BITNODE));

 p->Date = Date;

 p->LChild = LChild;

 p->RChild = RChild;

 return p;

 

}

//插入左孩子

void AddLChild(BITNODE *bt, int Date)

{

 BITNODE *p = (struct BITNODE*)malloc(sizeof(struct BITNODE));

 p->Date = Date;

 p->LChild = nullptr;

 p->RChild = nullptr;

 bt->LChild = p;

}

//插入右孩子

void AddRChild(BITNODE *bt, int Date)

{

 BITNODE *p = (struct BITNODE*)malloc(sizeof(struct BITNODE));

 p->Date = Date;

 p->LChild = nullptr;

 p->RChild = nullptr;

 bt->RChild = p;

}

//删除左孩子

void DelLChild(BITNODE *bt)

{

 BITNODE *p;

 p = bt->LChild;

 bt->LChild = nullptr;

 free(p);

}

//删除右孩子

void DelRChild(BITNODE *bt)

{

 BITNODE *p;

 p = bt->RChild;

 bt->RChild = nullptr;

 free(p);

}

class STACK

{

public:STACK(){ num = 100; };

    ~STACK(){ free(Button); };

public:

 

 void AddElement( int date);

 int GetOutElement();

private:

 void CreateStack();

private:

 int *Top = nullptr, *Button = nullptr;

 int num;

 

 

 //结构体指针

public:

 void CreateStacks();

 void AddElements(BITNODE *ptr);

 BITNODE* GetOutElements();

 

private:

 BITNODE **TopPtr = nullptr, **ButtonPtr = nullptr;

}stack;

void STACK::CreateStacks()

{

 ButtonPtr = (BITNODE **)calloc(MAX_LENTH, sizeof(struct BITNODE));

 TopPtr = ButtonPtr;

 --TopPtr;

 

 

}

void STACK::AddElements(BITNODE *ptr)
{
    if (ButtonPtr == nullptr)
    {
        CreateStacks();
    }
    //std::cout << "指针xiangjian" << Top - Button << std::endl;
    if ((TopPtr - ButtonPtr) >= num - 1)
    {
        num += 100;
        std::cout << num << std::endl;
        ButtonPtr = (BITNODE **)realloc(ButtonPtr, num*sizeof(struct BITNODE));
        if (ButtonPtr == nullptr)
        {
            std::cout << "指针失败" << std::endl;
            while (true);
        }
        if (ButtonPtr != nullptr)
        {
            std::cout << "指针成功" << std::endl;

        }
        TopPtr = ButtonPtr + num - 100 - 1;

    }
    ++TopPtr;
    *TopPtr = ptr;

}
BITNODE* STACK::GetOutElements()
{
    if (TopPtr - ButtonPtr >= 0)
    {

        BITNODE* ptr = *TopPtr;
        --TopPtr;
        return ptr;
    }
    else
    {
        return  nullptr;
    }

}

//创建栈
void STACK::CreateStack()
{

    Button = (int*)calloc(MAX_LENTH, sizeof(int));
    Top = Button;
    --Top;
    

}
void STACK::AddElement( int date)
{
    if (Button == nullptr)
    {
        CreateStack();
    }
    //std::cout << "指针xiangjian" << Top - Button << std::endl;
    if ((Top - Button) >= num-1)
    {
        num += 100;
        std::cout << num << std::endl;
        Button = (int*)realloc(Button, num*sizeof(int));
        if (Button == nullptr)
        {
            std::cout << "指针失败" << std::endl;
            while (true);
        }
        if (Button != nullptr)
        {
            std::cout << "指针成功" << std::endl;
            
        }
        Top = Button + num-100-1;
        
    }
    ++Top;
    *Top = date;
}
int STACK::GetOutElement()
{
    if (Top - Button >= 0)
    {
    
        int num = *Top;
        --Top;
        return num;
    }
    else return  -1;

}
//非递归遍历:栈
void NrPreOrder(BITNODE *bt)
{
    BITNODE stack_[MAX_LENTH], *p;
    p = bt;
    do
    {
        while (p != nullptr)
        {
            std::cout << p->Date << std::endl;
            if (p->RChild != nullptr)
            {
                stack.AddElements(p->RChild);
            }
            p = p->LChild;

        }
        p = stack.GetOutElements();
    } while (p != nullptr);

}
//递归前序遍历
void PreOrder(BITNODE *bt)
{
    if (bt == nullptr)
        return;
    else
    {
        std::cout << bt->Date << std::endl;
        PreOrder(bt->LChild);
        PreOrder(bt->RChild);
    }


}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值