非递归先序创建二叉树、非递归先序遍历二叉树(C语言代码)

关于用非递归方法对二叉树进行操作的原理已经有很多介绍,不再赘述,只简单介绍一下代码的思路:

非递归先序创建二叉树的代码利用栈顶标记当前节点位,代码约定输入'#'时表示该位置没有输入,每次输入新元素都作两轮if判定(左右指示器方向,是否输入'#'),据此改变状态进行下一步的调整。

非递归先序遍历二叉树使用栈模拟递归。

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

typedef char TreeData
typedef struct BTreeNode{
    TreeData data;
    BTreeNode *lChild,*rChild;
}BTreeNode;
typedef BTreeNode* StackData;
typedef struct LinkStack{
    StackData data;
    LinkStack *link;
}LinkStack;

LinkStack* InitStack();
void Push(LinkStack* top, StackData x);
bool StackEmpty(LinkStack* top);
StackData Pop(LinkStack* top);
StackData GetTop(LinkStack* top);
void MakeEmpty(LinkStack* top);
BTreeNode* NonRecursiveCreate();
void NonRecursivePreOrder(BTreeNode* T);

int main()
{
	BTreeNode *T = NonRecursiveCreate();
	NonRecursivePreOrder(T);
    printf("\n");
    system("pause");
    return 0;
}

//STACK//

LinkStack* InitStack()
{
    LinkStack* top = (LinkStack*)malloc(sizeof(LinkStack));
    top->link = NULL;
    return top;
}

void Push(LinkStack* top, StackData x)
{
   	LinkStack *p;
   	p = (LinkStack*)malloc(sizeof(LinkStack));
    p->data = x;
    p->link = top->link;
    top->link = p;
}

bool StackEmpty(LinkStack* top)
{
    if(top->link == NULL)
		return true;
    else
		return false;
}

StackData Pop(LinkStack* top)
{
    StackData x;
	LinkStack *p;
    if(StackEmpty(top))
		return 0;
    p = top->link;
    top->link = p->link;
    x = p->data;
    free(p);
    return x;
}

StackData GetTop(LinkStack* top)
{
    StackData x;
    if(StackEmpty(top))
		return 0;
    x = top->link->data;
    return x;
}

void MakeEmpty(LinkStack* top)
{
    LinkStack *p=top->link, *q;
    while(p!=NULL)
	{
    	q = p;
        p = p->link;
        free(q);
    }
}

//-----//

BTreeNode* NonRecursiveCreate()
{
    LinkStack *S = InitStack();
    BTreeNode *T, *p;
    T = (BTreeNode*)malloc(sizeof(BTreeNode));
    T->data = '#';
    T->lChild = NULL;
    T->rChild = NULL;
    char ch;
    bool isLeft = true;
    printf("Please input an element:");
    scanf("%c", &ch);
    getchar();
    if(ch != '#')
    {
        T->data = ch;
        //T->lChild = NULL;
        //T->rChild = NULL;
        Push(S, T);
    }
    while(!StackEmpty(S))
    {
        printf("Please input an element:");
        scanf("%c",&ch);
        getchar();
        p = (BTreeNode*)malloc(sizeof(BTreeNode));
        p->data = ch;
        //p->lChild = NULL;
        //p->rChild = NULL;
        if(isLeft)
        {
            if(ch != '#')
            {
                GetTop(S)->lChild = p;
                Push(S,p);
            }
            else
            {
                GetTop(S)->lChild = NULL;
                isLeft = false;
            }
        }
        else
        {
            if(ch != '#')
            {
                GetTop(S)->rChild = p;
                isLeft = true;
            }
            else
            {
                GetTop(S)->rChild = NULL;
                Pop(S);
            }
        }
    }
    return T;
}

void NonRecursivePreOrder(BTreeNode* T)
{
    LinkStack* S = InitStack();
    while(T || !StackEmpty(S))
    {
        while(T)
        {
            printf("%c ",T->data);
            Push(S,T);
            T = T->lChild;
        }
        if(!StackEmpty(S))
        {
            T = Pop(S);
            T = T->rChild;
        }
    }
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值