二叉树螺旋遍历
来源:互联网 发布:帮软件充值话费的软件 编辑:程序博客网 时间: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
- 二叉树螺旋遍历
- 螺旋遍历二叉树 Spiral-order traversal
- 二叉树层次遍历的螺旋打印
- 如何用一个栈实现二叉树的螺旋遍历
- 二维数组螺旋遍历
- dfs遍历螺旋矩阵
- 二叉树遍历、分层遍历
- 遍历二叉树--二叉树
- 【树】遍历二叉树
- 二叉树遍历
- 二叉树遍历
- 二叉树的遍历
- (原创)遍历二叉树
- 二叉树遍历-php
- 查找--遍历二叉树
- 遍历二叉树
- 二叉树遍历规则
- 二叉树的遍历
- 游戏计划4
- Android--Dialog详细讲解
- 微信营销不可随便套用微博模式的原因
- 普元日记--自定义底部遮罩层
- 通过文件内容识别文件是不是图片
- 二叉树螺旋遍历
- Android设计模式系列--观察者模式
- Android开发eclipse快捷键
- linux笔记之2--makefile
- 如何在Linux创建安全的临时文件
- Spring Mvc 源码理解。
- SpannableString设置除Color类中颜色以外的自定义颜色
- Android app身体质量指数(BMI)
- C++ 小记 vector 容器(一)