二叉树螺旋遍历

来源:互联网 发布:帮软件充值话费的软件 编辑:程序博客网 时间:2024/05/17 06:25
////  Created by 李宾 on 15/8/17.//  Copyright (c) 2015年 李宾. All rights reserved.///*******************************没有用c++的stack函数库,纯手写实现二叉树螺旋遍历**********************************/#include <iostream>using namespace std;typedef int ElemType;typedef struct TNode{    ElemType data;    struct TNode* lchild;    struct TNode* rchild;}*LinkNode;/*定义栈节点*/         //链式栈,栈节点和普通链节点定义一样。typedef struct node{    LinkNode data;    struct node* next;    }StackNode, *LinkStack;LinkNode create() //先序遍历创建1二插树   //建树的时候不会出现野指针错误,因为data=0,T=NULL;{    LinkNode T;    int data;    printf("请输入非零整数,0结束:");    scanf("%d",&data);    if(data==0)    {        T=NULL;    }    else{        T=new TNode();        T->data=data;        printf("左结点:\n");        T->lchild=create();        printf("右结点:\n");        T->rchild=create();    }    return T;}bool IsEmpty(LinkStack stack){    if (stack -> next==NULL) {        return true;    }    else        return false;}void InitStack(LinkStack& stack)  // 注意这点引用传值,因为new改变stack本身了,要想改变实参stack必须用引用传值。{    stack = new StackNode();}//栈顶指针总是指向栈顶元素的下一个地址。void Push(LinkStack stack,LinkNode e){    LinkStack node  = new StackNode();  //new ()会初始化结构体,不会出现野指针    node -> next = stack -> next;         //而new不会初始化,只返回指针。会出现野指针问题。    node -> data = e;    stack -> next = node;}void Pop(LinkStack stack){    if (!IsEmpty(stack))    {        if (stack -> next -> next != NULL) {            stack -> next = stack -> next -> next;        }        else if (stack -> next ->next ==NULL) {  //这里出现一个小错误,当时只写了if,if。。。if。。。是两个条件都判断            stack -> next = NULL;                //if。。。else if。。。是只选择一个判断。        }                    }    }void Traverse(LinkNode root){    LinkStack stack1,stack2;    InitStack(stack1);    InitStack(stack2);    Push(stack1, root);    while ((!IsEmpty(stack1))||(!IsEmpty(stack2))) {        while (!IsEmpty(stack1))        {            cout<<stack1->next->data->data<<" ";            if (stack1->next->data->lchild) {                Push(stack2, stack1->next->data->lchild);            }            if (stack1->next->data->rchild) {                Push(stack2, stack1->next->data->rchild);            }            Pop(stack1);        }        while (!IsEmpty(stack2))        {            cout<<stack2->next->data->data<<" ";            if (stack2->next->data->rchild) {                Push(stack1, stack2->next->data->rchild);            }            if (stack2->next->data->lchild) {                Push(stack1, stack2->next->data->lchild);            }            Pop(stack2);        }    }}int main(){    LinkNode T;        T = create();    Traverse(T);        return 0;        }

0 0