//
// 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;
}
二叉树螺旋遍历
最新推荐文章于 2022-08-17 23:15:11 发布