二叉树的链式结构的非递归遍历

一. 非递归前序遍历和非递归中序遍历

1.    Stack.h

#ifndef__STACK_H__

#define__STACK_H__

#include<stdio.h>

#include<stdlib.h>

// 栈的初始化大小

#defineSTACK_INIT_SIZE 8

// 栈满的时候增加的容量

#defineSTACK_INCR_SIZE 8

// 重命名了栈中数据元素的数据类型

typedef structBinTreeNode *StackElemType;

// 定义了栈的结构

typedef structStack

{

StackElemType *base;      //    栈底指针

StackElemType *top;         //   栈顶指针

int capacity;               //    栈的容量

}Stack;

// 栈中函数的声明

intinitStack(struct Stack *);

intincrStack(struct Stack *);

int isEmpty(structStack *);

int isFull(structStack *);

int push(structStack *, StackElemType);

int pop(structStack *);

int getHead(structStack *, StackElemType);

#endif

2.    Stack.c

#include"stack.h"

/*

* 函数名 :initStack

* 函数参数 :struct Stack *stack (栈管理结构的地址)

* 函数功能 :初始化栈的结构

* 函数返回值 :return 0

*

*/

intinitStack(struct Stack *stack)

{

stack->base = (StackElemType*)malloc(sizeof(StackElemType)*STACK_INIT_SIZE);

if(stack->base == NULL)

{

printf("malloc error!!!\n");

return -1;

}

stack->top = stack->base;

stack->capacity = STACK_INIT_SIZE;

return 0;

}

/*

* 函数名 :       incrStack

* 函数参数 :struct Stack *stack(栈的管理结构地址)

* 函数功能 : 在栈满了的时候给栈增加容量

* 函数返回值 : return 0

*/

intincrStack(struct Stack *stack)

{

StackElemType *newBase = (StackElemType*)realloc(stack->base, sizeof(StackElemType)*(stack->capacity +STACK_INCR_SIZE));

if(NULL == newBase)

{

return -1;

}

stack->base = newBase;

stack->top = stack->base +stack->capacity;

stack->capacity += STACK_INCR_SIZE;

return 0;

}

/*

* 函数名 :isFull

* 函数参数 :struct Stack *stack (栈的管理结构地址)

* 函数功能 : 判断栈是否满栈

* 函数返回值 : 如果栈是满返回1 否则返回0

*/

int isFull(structStack *stack)

{

return (stack->base +stack->capacity) == stack->top ? 1 : 0;

}

/*

* 函数名 :isEmpty

* 函数参数 : struct Stack *stack (栈的管理结构指针)

* 函数功能 : 判断栈是否是空栈

* 函数返回值 : 如果是空栈返回1 否则返回0

*/

int isEmpty(structStack *stack)

{

return stack->top == stack->base ?1 : 0;

}

/*

* 函数名 :       push

* 函数参数 :参数 1 struct Stack *stack(栈管理结构地址)

*                   参数 2 StackElemType item 入栈的数据元素

* 函数功能 : 入栈操作

* 函数返回值 : return 0

*/

int push(structStack *stack, StackElemType item)

{

if(isFull(stack) &&incrStack(stack) == -1)

{

printf("内部不足!!!\n");

return -1;

}

*(stack->top) = item;

stack->top ++;

return 0;

}

/*

* 函数名 :getHead

* 函数参数 :参数 1 struct Stack *stack(栈管理结构的地址)

*           参数 2 StackElemType *item 出栈数据元素存放的地方

* 函数功能 : 获取栈顶元素的值

* 函数返回值 : return 0

*/

int getHead(structStack *stack, StackElemType *item)

{

if(isEmpty(stack))

{

return 0;

}

*item = *(stack->top - 1);

return 0;

}

/*

* 函数名 :pop

* 函数参数 :struct Stack *stack(栈管理结构的地址)

* 函数功能 : 出栈

* 函数返回值 : return 0

*/

int pop(structStack *stack)

{

if(isEmpty(stack))

{

return 0;

}

stack->top --;

return 0;

}

3.    BinTree.h

#ifndef__BINTREE_H__

#define__BINTREE_H__

#include<stdio.h>

#include<stdlib.h>

#include"stack.h"

// typedef关键字是用来重命名数据类型的 这里重命名了数结点中有效数据的类型

typedef intBinTreeElemType;

// 定义了树的结点类型

typedef structBinTreeNode

{

BinTreeElemType data;                   // 1. 结点中有效数据

struct BinTreeNode *leftChild;       // 2. 结点的左孩子指针

struct BinTreeNode *rightChild;     // 3. 结点的右孩子指针

}BinTreeNode;

// 定义了树的结构

typedef structBinTree

{

struct BinTreeNode *root;              // 1. 树根的指针

char refvalue;                                 // 2. 定义了结点为空的标志位

}BinTree;

// 函数的声明

intinitBinTree(struct BinTree *);

intcreateBinTree(struct BinTree *);

intpreOrder(struct BinTree *tree);

int inOrder(structBinTree *);

intpostOrder(struct BinTree);

#endif

4.    BinTree.c

#include"BinTree.h"

/*

*  函数名 : initBinTree

*  函数参数 : struct BinTree *tree(树结构的地址)

*  函数的功能 :在我们创建一颗二叉树的时候,对二叉树进行初始化

*                 1.将根结点的指针 指向为NULL 避免野指针

*                 2.使用 '#' 作为空结点的标志

*  函数的返回值 : return 0

*/

intinitBinTree(struct BinTree *tree)

{

tree->root = NULL;

tree->refvalue = '#';

return 0;

}

/*

*  函数名 :createBinTree

*  函数参数 :struct BinTree *tree(树结构的地址)

*  函数的功能 :创建一颗二叉树这个方法是给用户调用的

*  函数的返回值 :return 0

*

*/

intcreateBinTree(struct BinTree *tree)

{

__createBinTree(tree,&(tree->root));

return 0;

}

/*

*  函数名 :__createBinTree

*  函数参数 :参数1 struct BinTree *tree (树的地址)

*            参数2 struct BinTreeNode **t(二重指针 自己理解)

*  函数功能 : 这个方法是内部的方法 被createBinTree函数调用

*  函数返回值 : return 0

*/

int__createBinTree(struct BinTree *tree, struct BinTreeNode **t)

{

// 测试字符串 ABC##DE##F##G#H##

char item;

scanf("%c", &item);

if(item == tree->refvalue)

{

*t = NULL;

}

else

{

*t = (struct BinTreeNode*)malloc(sizeof(struct BinTreeNode));

(*t)->data = item;

(*t)->leftChild =(*t)->rightChild = NULL;

__createBinTree(tree,&((*t)->leftChild));

__createBinTree(tree,&((*t)->rightChild));

}

return 0;

}

/*

*  函数名 :preOrder

*  函数参数 :struct BinTree *tree (树的地址)

*  函数功能 :非递归前序遍历二叉树

*  函数返回值 :return 0

*/

intpreOrder(struct BinTree *tree)

{

printf("递归前序遍历二叉树 : ");

__preOrder(tree->root);

printf("\n");

return 0;

}

/*

*  函数名 :__preOrder

*  函数参数 :struct BinTreeNode *t (树中结点的指针)

*  函数功能 :该函数是内部函数被preOrder函数调用

*  函数返回值 :return 0

*/

int__preOrder(struct BinTreeNode *t)

{

struct BinTreeNode *p = t;

struct Stack stack;

initStack(&stack);

push(*stack, p);

while(!isEmpty(&stack))

{

getHead(&stack, &p);

pop(&stack);

printf("%c",p->data);

if(p->rightChild != NULL)

{

push(&stack,p->rightChild);

}

if(p->leftChild != NULL)

{

push(&stack,p-leftChild);

}

}

return 0;

}

// 中序遍历二叉树

int inOrder(structBinTree *tree)

{

printf("递归中序遍历二叉树 : ");

__inOrder(tree->root);

printf("\n");

return 0;

}

int__inOrder(struct BinTreeNode *t)

{

struct BinTreeNode *p = t;

struct Stack stack;

initStack(&stack);

push(&stack, p);

while(!isEmpty(&stack))

{

while(p->leftChild != NULL)

{

p = p->leftChild;

push(&stack, p);

}

getHead(&stack, &p);

pop(&stack);

printf("%c",p->data);

if(p->rightChild != NULL)

{

p = p->rightChilsd;

push(&stack, p);

}

}

return 0;

}

5.    Main.c

#include"BinTree.h"

int main(int argc,char &argv)

{

struct BinTree tree;

// 初始化二叉树

initBinTree(&tree);

// 创建二叉树

createBinTree(&tree);

// 非递归前序遍历

preOrder(&tree);

// 非递归中序遍历

inOrder(&tree);

// 非递归后续遍历

postOrder(&tree);

return 0;

}

二. 非递归后序遍历

1.    Stack.h

#ifndef__STACK_H__

#define__STACK_H__

#include<stdio.h>

#include<stdlib.h>

// 栈的初始化大小

#defineSTACK_INIT_SIZE 8

// 栈满的时候增加的容量

#defineSTACK_INCR_SIZE 8

// 重命名了栈中数据元素的数据类型

typedef structStackNode StackElemType;

// 定义了栈的结构

typedef structStack

{

StackElemType *base;      //    栈底指针

StackElemType *top;         //   栈顶指针

int capacity;               //    栈的容量

}Stack;

// 配合后续遍历使用栈中保存的数据类型

typedefenum{L,R}FLAG;

typedef structStackNode

{

struct BinTreeNode *brAddress;

FLAG flag;

}StackNode;

// 栈中函数的声明

intinitStack(struct Stack *);

intincrStack(struct Stack *);

int isEmpty(structStack *);

int isFull(structStack *);

int push(structStack *, StackElemType);

int pop(structStack *);

int getHead(structStack *, StackElemType);

#endif

2.    Stack.c

同上

3.    BinTree.h

同上

4.    BinTree.c

// 后序遍历二叉树

intpostOrder(struct BinTree *tree)

{

printf("递归中序遍历二叉树 : ");

__postOrder(tree->root);

printf("\n");

return 0;

}

int__postOrder(struct BinTreeNode *t)

{

struct BinTreeNode *p = t;

struct Stack stack;

initStack(&stack);

struct StackNode stNode;

do

{

while(p != NULL)

{

stNode.btAddress = p;

stNode.flag = L;

push(&stack, stNode);

p = p->leftChild;

}

getHead(&stack, &stNode);

pop(&stack);

if(stNode.flag == R)

{

printf("%c",stNode.brAddress->data);

continue;

}

if(stNode.flag = L)

{

stNode.flag = R;

push(&stack, stNode);

p =stNode.btAddress->rightChild;

}

}while(!isEmpty(&stack));

}

其余代码同上

5.    Main.c

同上

二叉树的链式结构的非递归遍历相关推荐

  1. 二叉树的链式结构递归遍历实现

    二叉树的链式结构递归遍历实现 1.     BinTree.h文件 #ifndef__BINTREE_H__ #define__BINTREE_H__ #include<stdio.h> ...

  2. 【数据结构初阶】第八篇——二叉树的链式结构(二叉树的前、中和后序遍历+层序遍历+链式结构的实现+相关简单的递归问题)

    ⭐️本篇博客我要来和大家一起聊一聊数据结构中的二叉树的链式结构的实现及相关的一些问题的介绍 ⭐️博客代码已上传至gitee:https://gitee.com/byte-binxin/data-str ...

  3. 冰冰学习笔记:二叉树的进阶OJ题与非递归遍历

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  4. LintCode 378. 将二叉树转换成双链表(非递归遍历)

    文章目录 1. 题目 2. 解题 1. 题目 将一个二叉树按照中序遍历转换成双向链表. 样例 样例 1: 输入:4/ \2 5/ \1 3 输出: 1<->2<->3<- ...

  5. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  6. 每天一道LeetCode-----将二叉树原地平铺成链式结构

    Flatten Binary Tree to Linked List 原题链接Flatten Binary Tree to Linked List 给定一个二叉树,将其原地平铺成链式结构(按先序遍历的 ...

  7. 二叉树的建造、递归与非递归遍历

    #include "stdafx.h" #include <iostream> #include <stack> #include <queue> ...

  8. 二叉树链式结构的实现

    目录 1.二叉树链式结构的实现 1.1前置说明 1.2二叉树的遍历 1.2.1前序.中序以及后序遍历 1.2.2层序遍历 1.3二叉树节点个数及高度等 1.4二叉树的创建和销毁 1.5完全二叉树的判断 ...

  9. 二叉树的链式存储结构--二叉链表

    1 二叉树的链式存储结构 //二叉链表的结点结构定义typedef int TElemType; typedef struct BiTNode {TElemType data;struct BiTNo ...

最新文章

  1. 直播报名 | NVIDIA公开课:Style-Gan的架构与实现
  2. Spring @Conditional
  3. jsp页面模块的来源
  4. [Offer收割]编程练习赛42
  5. java坦克大战思路总结
  6. bin文件转换成html,bin如何改成mp4
  7. 任务管理器被管理员禁用,命令提示符被禁用,注册表被禁用,组策略被禁用的解决办法
  8. golang指数运算
  9. Java成神之路(持续更新)
  10. position:relative的用法
  11. 几个创业小故事的启示
  12. [云上贵州2017]智慧交通预测挑战赛
  13. busybox v1.22.1(debian 1:1.22.0-19) built-in shell(ash)解决方案
  14. matlab实现密堆立方体,LAMMPS如何定义六角密堆结构HCP
  15. java ftp 下载 0k_Ftp下载文件大小为0 KB
  16. 拼多多2020届数据分析面试题合集
  17. Kali Linux使用arpspoof命令进行断网攻击(ARP欺骗)
  18. Fedora下载地址
  19. 2.4G蓝牙双模方案xii5168 超高性价比
  20. 三十、Fluent两种蒸发-冷凝模型理论及设置

热门文章

  1. 剪裁tiff影像数据_能看更会用,超擎影像云平台带你轻松玩转海量影像!
  2. Java黑皮书课后题第1章:1.3(显示图案)编写程序,显示下面的图案 Java
  3. [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
  4. MyEclipse导入eclipse的web项目,将WebRoot切换为WebContent
  5. The driver has not received any packets from the server
  6. 直播技术初体验,简单实现直播不同阶段
  7. BZOJ 3907: 网格( 组合数 + 高精度 )
  8. C#中要使一个类支持FOREACH遍历,实现过程怎样? [转]
  9. SQL Server 2008 阻止保存要求重新创建表的更改
  10. 11月25日struts培训日记