二叉树的非递归创建

新手一枚,希望记下自己写的代码,希望各位亲能够给我提出意见和建议

#include<stdio.h>
#include<stdlib.h>


#define MAX 999                 //MAX表示结点是否置为空
#define MAX_SIZE 100      //栈的最大容量


typedef int ElemType;
typedef struct TreeNode{    //定义树节点
int data;
struct TreeNode* rightchild;
struct TreeNode* leftchild;
}TreeNode;






typedef struct Stack{//定义树节点栈
TreeNode* stack[MAX_SIZE];
int top;//栈顶索引,初始化为-1,
}Stack; 


void CreateStack(Stack &s){//创建栈
for(int i=0;i<MAX_SIZE;i++)
s.stack[i]= NULL;
s.top = -1;
}


void Push(Stack &s,TreeNode* treenode){//将treenode元素压栈
s.stack[++s.top] = treenode;
}


void Pop(Stack &stack){//将栈顶元素弹栈
stack.top--;
}


TreeNode* GetTop(Stack s){
return s.stack[s.top];
}


bool IsEmpty(Stack s){//判断栈是否为空


if(s.top == -1)
return true;
else
return false;
}


void CreateTree(TreeNode* &root){
int data;
Stack stack;
TreeNode* top,* temp;
top = temp =NULL;
CreateStack(stack);//创建栈
printf("输入首树节点的数据域,999代表为空\n");
scanf("%d",&data);


if(data == MAX)
root = NULL;
else{
root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = data;
root->leftchild = NULL;
root->rightchild = NULL;
Push(stack,root);
}//判断检测树根是否为空,不空则压栈

while(!IsEmpty(stack)){//若栈不空,则继续输入数据
top = GetTop(stack);//获取栈顶元素


if(top->leftchild == NULL  && top->rightchild == NULL){

printf("输入%d的左孩子\n",top->data);
scanf("%d",&data);


if(data == MAX)
top->leftchild = NULL;
else{//若栈顶元素左孩子不空则压栈
temp = top->leftchild = (TreeNode*)malloc(sizeof(TreeNode));
temp->data = data;
temp->leftchild = NULL;
temp->rightchild = NULL;
Push(stack,temp);
continue;
}//else
}//if对栈顶元素左孩子操作


if(top->rightchild == NULL){
printf("输入%d的右孩子\n",top->data);
scanf("%d",&data);


if(data == MAX)
top->rightchild = NULL;
else{
temp = top->rightchild = (TreeNode*)malloc(sizeof(TreeNode));
temp->data = data;
temp->leftchild = NULL;
temp->rightchild = NULL;
Push(stack,temp);
continue;
}
}//if
Pop(stack);
}//while
}


void ShowTree(TreeNode* root){//递归先序遍历树
if(root!=NULL){
printf("%4d",root->data);
ShowTree(root->leftchild);
ShowTree(root->rightchild);
}
}


int main()

{//主函数
TreeNode *root;
CreateTree(root);
ShowTree(root);
printf("\n");


return 0;
}

对于栈的操作 ,仅仅做了简单操作;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值