二叉树的先序、中序和后序的非递归遍历(C语言实现)
来源:互联网 发布:体积最小的单片机 编辑:程序博客网 时间:2024/04/30 10:40
1、顺序栈的声明
#ifndef _seq_stack_h#define _seq_stack_h#include "binary_tree.h"#define STACK_INIT_SIZE 5#define STACK_INCR_SIZE 2typedef bitree_node * stack_elem_type;//typedef int stack_elem_type;typedef struct seq_stack{stack_elem_type * base;stack_elem_type * top;int size;}seq_stack;void init_stack_sq( seq_stack * stack );void free_stack_sq( seq_stack * stack );stack_elem_type get_top_sq( seq_stack stack );void pop_elem_sq( seq_stack * stack );void push_elem_sq( seq_stack * stack, stack_elem_type e );int stack_empty_sq( seq_stack stack );int stack_length_sq( seq_stack stack );void trav_stack_sq( seq_stack stack );#endif
2、顺序栈的实现
#include <stdlib.h>#include <stdio.h>#include <assert.h>#include "seq_stack.h"void init_stack_sq( seq_stack * stack ){stack->size = STACK_INIT_SIZE;stack->base = stack->top = ( stack_elem_type * )malloc( STACK_INIT_SIZE * sizeof( stack_elem_type ) );assert( stack->base != NULL );}void free_stack_sq( seq_stack * stack ){stack->size = 0;free( stack->base );stack->base= stack->top = NULL;}void push_elem_sq( seq_stack * stack, stack_elem_type e ){stack_elem_type * base = NULL, * p = NULL, * q = NULL;if( stack->top - stack->base >= stack->size ){stack->size += STACK_INCR_SIZE;base = ( stack_elem_type * )malloc( sizeof( stack_elem_type ) * stack->size );assert( base != NULL );p = base; q = stack->base;while( q < stack->top )*p++ = *q++;free( stack->base );stack->base = base;stack->top = stack->base + ( stack->size - STACK_INCR_SIZE );}*stack->top++ = e;}stack_elem_type get_top_sq( seq_stack stack ){return stack_empty_sq( stack ) ? NULL : *( stack.top - 1 );}void pop_elem_sq( seq_stack * stack ){assert( stack->top > stack->base );--stack->top;}int stack_length_sq( seq_stack stack ){return stack.top - stack.base;}int stack_empty_sq( seq_stack stack ){return stack.base == stack.top;}void trav_stack_sq( seq_stack stack ){stack_elem_type * p = stack.base;while( p < stack.top )printf( "%c ", (*p++)->data );printf( "\n" );}
3、循环队列的声明
#ifndef _circ_queue_h#define _circ_queue_h#include "binary_tree.h"typedef bitree_node * queue_elem_type;typedef struct circ_queue {queue_elem_type * buffer;int front, rear;int size;}circ_queue;void init_circ_queue( circ_queue * cq );void clear_circ_queue( circ_queue * cq );void free_circ_queue( circ_queue * cq );void trav_circ_queue( circ_queue cq );int push_elem_cq( circ_queue * cq, queue_elem_type e );queue_elem_type get_front_elem_cq( circ_queue cq );void pop_elem_cq( circ_queue * cq );int circ_queue_length( circ_queue cq );int circ_queue_empty( circ_queue cq );#endif
4、循环队列的实现
#include <stdlib.h>#include <stdio.h>#include <assert.h>#include "circ_queue.h"void init_circ_queue( circ_queue * cq ){cq->size = 10;cq->buffer = ( queue_elem_type * )malloc( sizeof( queue_elem_type ) * cq->size );assert( cq->buffer );cq->front = cq->rear = 0;}void clear_circ_queue( circ_queue * cq ){cq->front = cq->rear = 0;}void free_circ_queue( circ_queue * cq ){cq->size = 0;free( cq->buffer );cq->front = cq->rear = 0;}int circ_queue_empty( circ_queue cq ){return cq.front == cq.rear;}int circ_queue_full( circ_queue cq ){return ( cq.rear + 1 ) % cq.size == cq.front;}void trav_circ_queue( circ_queue cq ){int i;if( ! circ_queue_empty( cq ) ){i = cq.front;while( i % cq.size != cq.rear ){printf( "%c ", cq.buffer[i++]->data );}}}int push_elem_cq( circ_queue * cq, queue_elem_type e ){int res = -1;if( ! circ_queue_full( *cq ) ){cq->buffer[cq->rear++] = e;cq->rear %= cq->size;res = 0;}return res;}queue_elem_type get_front_elem_cq( circ_queue cq ){return circ_queue_empty( cq ) ? NULL : cq.buffer[cq.front];}void pop_elem_cq( circ_queue * cq ){assert( ! circ_queue_empty( *cq ) );cq->front = ( cq->front + 1 ) % cq->size;}int circ_queue_length( circ_queue cq ){return ( cq.rear - cq.front + cq.size ) % cq.size;}
5、用于后序遍历的顺序栈类型声明
#ifndef _post_order_seq_stack_h#define _post_order_seq_stack_h#include "binary_tree.h"#define STACK_INIT_SIZE 5#define STACK_INCR_SIZE 2typedef enum visit_flag { LR, RR }visit_tag;typedef struct po_stack_elem_type{bitree_node * ptr;visit_tag tag;}po_stack_elem_type;typedef struct po_seq_stack{po_stack_elem_type * base;po_stack_elem_type * top;int size;}po_seq_stack;void init_stack_posq( po_seq_stack * stack );void free_stack_posq( po_seq_stack * stack );po_stack_elem_type get_top_posq( po_seq_stack stack );void pop_elem_posq( po_seq_stack * stack );void push_elem_posq( po_seq_stack * stack, po_stack_elem_type e );int stack_empty_posq( po_seq_stack stack );int stack_length_posq( po_seq_stack stack );#endif
6、二叉树类型声明
#ifndef _binary_tree_h#define _binary_tree_htypedef char elem_type;typedef struct bitree_node{elem_type data;struct bitree_node * lchild, * rchild;}bitree_node;typedef bitree_node * binary_tree;void create_bitree( binary_tree * root );void free_bitree( binary_tree * root );void trav_preorder( binary_tree root );void trav_preorder_recur( binary_tree root );void trav_inorder( binary_tree root );void trav_inorder_recur( binary_tree root );void trav_postorder( binary_tree root );void trav_postorder_recur( binary_tree root );void trav_level_order( binary_tree root );#endif
7、二叉树实现
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "binary_tree.h"#include "seq_stack.h"#include "circ_queue.h"#include "po_seq_stack.h"void create_bitree( binary_tree * root ){char ch;if( ( ch = getchar() ) == '#' ){*root = NULL;}else{*root = ( bitree_node * )malloc( sizeof( bitree_node ) );( *root )->data = ch;create_bitree( &( *root )->lchild );create_bitree( &( *root )->rchild );}}void free_bitree( binary_tree * root ){if( *root != NULL ){free_bitree( &( *root )->lchild );free_bitree( &( *root )->rchild );free( *root );*root = NULL;}}void trav_preorder_recur( binary_tree root ){if( root != NULL ){printf( "%c", root->data );trav_preorder_recur( root->lchild );trav_preorder_recur( root->rchild );}}void trav_inorder_recur( binary_tree root ){if( root != NULL ){trav_inorder_recur( root->lchild );printf( "%c ", root->data );trav_inorder_recur( root->rchild );}}void trav_postorder_recur( binary_tree root ){if( root != NULL ){trav_postorder_recur( root->lchild );trav_postorder_recur( root->rchild );printf( "%c ", root->data );}}void trav_preorder( binary_tree root ){seq_stack node_seq; /* node sequence */stack_elem_type p = root;init_stack_sq( &node_seq );push_elem_sq( &node_seq, NULL );while( p != NULL ){printf( "%c ", p->data );if( p->rchild != NULL )push_elem_sq( &node_seq, p->rchild );if( p->lchild != NULL )p = p->lchild;else{p = get_top_sq( node_seq );pop_elem_sq( &node_seq );}}free_stack_sq( &node_seq );}void trav_inorder( binary_tree root ){seq_stack stack;bitree_node * p = root;init_stack_sq( &stack );while( p != NULL || ! stack_empty_sq( stack ) ){if( p != NULL ){push_elem_sq( &stack, p );p = p->lchild;}else{p = get_top_sq( stack );pop_elem_sq( &stack );printf( "%c ", p->data );p = p->rchild;}}free_stack_sq( &stack );}void trav_postorder( binary_tree root ){po_seq_stack stack; // po: post-orderpo_stack_elem_type elem;bitree_node * p = root;init_stack_posq( &stack );while( p != NULL || ! stack_empty_posq( stack ) ){while( p != NULL ){elem.ptr = p;elem.tag = LR;push_elem_posq( &stack, elem );p = p->lchild;}elem = get_top_posq( stack );pop_elem_posq( &stack );p = elem.ptr;if( elem.tag == LR ){elem.tag = RR;push_elem_posq( &stack, elem );p = p->rchild;}else{printf( "%c ", p->data );p = NULL;}}free_stack_posq( &stack );}void trav_level_order( binary_tree root ){circ_queue cq;queue_elem_type p = NULL;init_circ_queue( &cq );if( root != NULL ){push_elem_cq( &cq, root );while( ! circ_queue_empty( cq ) ){p = get_front_elem_cq( cq );pop_elem_cq( &cq );printf( "%c ", p->data );if( p->lchild != NULL )push_elem_cq( &cq, p->lchild );if( p->rchild != NULL )push_elem_cq( &cq, p->rchild );}}free_circ_queue( &cq );}
8、测试程序
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include "binary_tree.h"#include "seq_stack.h"int main( int argc, char * argv[] ){binary_tree root = NULL;create_bitree( &root );printf( "PreOrder recursive: " );trav_preorder_recur( root );printf( "\n" );trav_preorder( root );printf( "\n\n" );printf( "InOrder recursive: " );trav_inorder_recur( root );printf( "\n" );trav_inorder( root );printf( "\n\n" );printf( "PostOrder recursive:" );trav_postorder_recur( root );printf( "\n" );trav_postorder( root );printf( "\n\n" );printf( "Level Order: " );trav_level_order( root );printf( "\n" );free_bitree( &root );return 0;}
- 二叉树的先序、中序和后序的非递归遍历(C语言实现)
- c语言原生实现二叉树的 非递归 中序 先序 后序 遍历
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- C语言非递归实现二叉树的先序、中序、后序、层序遍历
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 建立二叉树,实现二叉树的先序遍历、中序和后序遍历的非递归算法
- 二叉树遍历的非递归算法(先序、中序、后序)代码实现
- 递归和非递归的方式实现二叉树的先序、中序和后序遍历
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- 分别用递归和非递归方式实现二叉树的先序、中序和后序遍历
- 二叉树的创建和先序,中序,后序,递归,非递归遍历
- 二叉树的先序、中序和后序遍历,递归与非递归方式实现。
- 二叉树的先序、中序、后序遍历的非递归实现
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- 二叉树的先序、中序、后序遍历(递归 and 非递归)
- 二叉树的先序、中序、后续遍历的递归和非递归实现
- 二叉树的先序,中序和后序遍历的非递归算法
- cocos2d-x离线文档生成
- Java数组排序算法,冒泡,选择,插入,快速排序
- 咨询面试初探
- PHP / MySQL的选择页面上的数据和分割
- QualityCenter10+Oracle10.2.1.0.1+Win2003SP2企业版安装步骤
- 二叉树的先序、中序和后序的非递归遍历(C语言实现)
- 搜索剪枝
- 看到了一个Zynq基本系统
- 8/5/2012
- Android 的不同尺寸图片和布局(手机)
- Android ApiDemos示例解析(109):Views->Custom
- Vaadin Web应用开发教程(10):UI组件-TextField
- Gentoo 启动黑屏
- C++编程实用技巧——专家讲述C++程序设计的窍门