二叉树遍历(递归与非递归)算法

二叉树定义

#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 30
#define STACKINCREMENT  10
#define OK 1
#define ERROR -1
typedef char TElemType;
typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild, *rchild;
    int flag;
}BiTNode,*BiTree;
typedef BiTree SElemType;
typedef int Status;
typedef struct{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;
void Print(char e){
 printf(" %c",e);
}

构造一个空栈

Status InitStack(SqStack &s){
 s.base = (SElemType * ) malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!s.base) return(-1);
    s.top=s.base;
    s.stacksize=STACK_INIT_SIZE;
    return OK;
}

若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

Status GetTop(SqStack s, SElemType &e ){
    if( s.top == s.base) return ERROR;
    e = *(s.top-1);
    return OK;
}

插入元素e为新的栈顶元素

Status Push(SqStack &s, SElemType e){
    if(s.top-s.base >= s.stacksize){    //栈满,追加存储空间
        s.base = (SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!s.base) return(-1); //存储分配失败
        s.top = s.base + s.stacksize;
        s.stacksize += STACKINCREMENT;
    }
    *s.top++ = e;
    return OK;
}

若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

Status Pop(SqStack &s, SElemType &e){
    if(s.top==s.base)return ERROR;
    e = * --s.top;
    return OK;
}

判断栈空

int StackEmpty(SqStack s) {
    return s.base == s.top;
}

利用先序序列建立二叉树

void RecursionCreateBiTree(BiTree &T){
 char ch;
 ch = getchar();
 if(ch ==‘#‘)
  T=NULL;
 else{
  T = (BiTree)malloc(sizeof(BiTNode));
  T->data = ch;
  RecursionCreateBiTree(T->lchild);
  RecursionCreateBiTree(T->rchild);
 }
}

先序递归遍历二叉树

void RecursionPreOrder(BiTree t){
 if(t!=NULL){
  printf(" %c",t->data);
  RecursionPreOrder(t->lchild);
  RecursionPreOrder(t->rchild);
 }
}

中序递归遍历二叉树

void RecursionInOrder(BiTree t){
 if(t!=NULL){
  RecursionInOrder(t->lchild);
  printf(" %c",t->data);
  RecursionInOrder(t->rchild);
 }
}

后序递归遍历二叉树

void RecursionPostOrder(BiTree t){
 if(t!=NULL){
  RecursionPostOrder(t->lchild);
  RecursionPostOrder(t->rchild);
  printf(" %c",t->data);
 }
}

非递归先序遍历二叉树

void NoRecursionPreOrderTraverse(BiTree T){
 SqStack S;
 BiTree P = T;
 InitStack(S);
 while(P!=NULL ||  !StackEmpty(S)){
  if(P){
   Print(P->data);
   Push(S,P);
   P=P->lchild;
  }
  else{
   Pop(S,P);
   P=P->rchild;
  }
 }
}

非递归中序遍历二叉树

void NoRecursionInOrderTraverse(BiTree T){
 SqStack S;
 InitStack(S);
 BiTree p;
 Push(S,T);
 while(!StackEmpty(S)){
  while(GetTop(S,p)&&p)
   Push(S,p->lchild);
  Pop(S,p);
  if(!StackEmpty(S)){
   Pop(S,p);
   printf(" %c",p->data);
   Push(S,p->rchild);
  }
 }
}

非递归后序遍历

void NoRecursionPostOrderTraverse(BiTree T){
 SqStack S;
 InitStack(S);
 BiTree p = T;
 while(p || !StackEmpty(S)){
  if(p){
   if(p->flag==1 ){
    p->flag = 2;         //此时将flag设置成2可让下一次调用此函数访问此二叉树不受影响
    printf(" %c",p->data);
    if(StackEmpty(S))
     break;
    Pop(S,p);
   }
   else
   {
    p->flag = 1;
    Push(S,p);
    Push(S,p->rchild);
    p = p->lchild;
   }
  }
  else
   Pop(S,p);
 }
}

打印

void main(){
 BiTree T;
 printf("请输入先序序列,用 # 表示空:\n");
 RecursionCreateBiTree(T);
 printf("\n");
 printf("先序递归:");
 RecursionPreOrder(T);
 printf("\n");
 printf("中序递归:");
 RecursionInOrder(T);
 printf("\n");
 printf("后序递归:");
 RecursionPostOrder(T);
 printf("\n");
 printf("先序非递归:");
 NoRecursionPreOrderTraverse(T);
 printf("\n");
 printf("中序非递归:");
 NoRecursionInOrderTraverse(T);
 printf("\n");
 printf("后序非递归:");
 NoRecursionPostOrderTraverse(T);
 printf("\n");
}

二叉树

时间: 2024-12-07 21:09:15

二叉树遍历(递归与非递归)算法的相关文章

二叉树遍历算法总结(递归与非递归)

一:前言 二叉树的遍历方法分四种:前序,中序,后序以及层次遍历. 其中,前中后遍历方法的实现分递归和非递归,非递归遍历的实现需要借助于栈. 实际上,递归的调用就是一种栈的实现,所以,非递归遍历就需要人工借助栈结构来实现. 而层次遍历需要借助队列. 二:前中后序遍历 递归遍历: 递归遍历的思想和方法很简单,通过调整输出语句来实现前,中,后三种遍历. 代码如下: 1 void show(BiTree T) 2 { 3 if(T) 4 { 5 printf("%c ",T->data)

二叉树递归与非递归遍历,最近公共父节点算法

#include <iostream> #include <stack> using namespace std; #define MAX 100 //字符串最大长度 typedef struct Node //二叉树结点 { char data; Node *lchild,*rchild; } *Btree; void createBT(Btree &t); //先序构造二叉树 void preorder(Btree &t); //二叉树递归先序遍历 void i

【数据结构与算法】二叉树递归与非递归遍历(附完整源码)(转)

转自:http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现. 一.三种遍历方式的递

二叉树遍历递归与非递归实现

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树遍历是二叉树中非常基础的部分,也是学习二叉树必须熟练掌握的部分,下面我们先给出二叉树三种遍历方式的定义,并通过举例来说明二叉树遍历的过程. 二叉树的遍历分为:前序遍历(也叫先序遍历).中序遍历.后序遍历.所谓前.中.后都是根据当前子树根结点相对左右孩子的位置而言,也就是说: 前序遍历:根结点在前,即:根 ----->左------->右: 中序遍历:根结点在中间,即:左------>根------>右: 后序遍历:根结点在最

二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历

对于一种数据结构而言,遍历是常见操作.二叉树是一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树.二叉树的节点声明如下: 1 typedef struct TreeNode *PtrToNode; 2 typedef struct TreeNode *BinTree; 3 4 struct TreeNode 5 { 6 int Data; //为简单起见,不妨假设树节点的元素为int型 7 BinTree Left; 8 BinTree Right; 9 }; 二叉树的遍历主要有先序遍历

数据结构二叉树的递归与非递归遍历之 实现可编译(1)java

前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推! 二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处. 二叉树的先序遍历:先访问根节点,再访问先后访问左右节点.如图: 二叉树的递归遍历之java

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍