#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);
}
}