二叉树的递归和非递归实现
来源:互联网 发布:阿里云ecs地域选择 编辑:程序博客网 时间:2024/05/16 18:01
#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct BiTree{ int data; struct BiTree* lchild; struct BiTree* rchild;}BiTree, *PBiTree;typedef struct Stack{ BiTree* data[128]; int top;}Stack;void stack_init(Stack* pStack){ memset(pStack, 0, sizeof(Stack)); pStack->top = -1;}BiTree* stack_pop(Stack* pStack){ if(pStack->top == -1) return NULL; return pStack->data[pStack->top--];}BiTree* stack_get_top(Stack* pStack){ if(pStack->top == -1) return NULL; else return pStack->data[pStack->top];}int stack_push(Stack* pStack, BiTree* pBiTree){ if(pStack->top == 127) return 0; pStack->data[++pStack->top] = pBiTree; return 1;}int stack_is_empty(Stack* pStack){ return pStack->top == -1;}int bitree_create(BiTree** ppBiTree){ int data; for(;;){ printf("输入节点的值:"); if(scanf("%d", &data) == 1) break; fflush(stdin); } if(data == 0){ (*ppBiTree) = NULL; return 1; }else{ (*ppBiTree) = (PBiTree)malloc(sizeof(BiTree)); if(!*ppBiTree){ perror("内存分配失败"); return 0; }else{ memset(*ppBiTree, 0, sizeof(BiTree)); (*ppBiTree)->data = data; bitree_create(&(*ppBiTree)->lchild); bitree_create(&(*ppBiTree)->rchild); } } return 1;}//释放二叉树void bitree_free(BiTree* pBiTree){ if(pBiTree){ bitree_free(pBiTree->lchild); bitree_free(pBiTree->rchild); free(pBiTree); pBiTree = NULL; }}/*先序遍历非递归算法*/void PreOrderTraverse(BiTree* pBiTree){ Stack stk; BiTree* pb = pBiTree; stack_init(&stk); while(pb || !stack_is_empty(&stk)){ while(pb){ printf("%d ", pb->data); stack_push(&stk, pb); pb = pb->lchild; } pb = stack_pop(&stk); pb = pb->rchild; }}/*先序遍历递归算法*/void PreOrderTraverse2(BiTree* pBiTree){ if(pBiTree){ printf("%d ", pBiTree->data);//显示数据 PreOrderTraverse2(pBiTree->lchild);//访问左孩子 PreOrderTraverse2(pBiTree->rchild);//访问右孩子 }}/* 中序遍历递归算法 */void InOrderTraverse2(BiTree* pBiTree){ if(pBiTree){ InOrderTraverse2(pBiTree->lchild); printf("%d ", pBiTree->data); InOrderTraverse2(pBiTree->rchild); }}/* 中序遍历递归算法2 */void InOrderTraverse3(BiTree* pBiTree){ Stack stk; BiTree* pb = NULL; stack_init(&stk); pb = pBiTree; while(pb || !stack_is_empty(&stk)){ if(pb){ stack_push(&stk, pb);//根指针进栈 pb = pb->lchild;//遍历左子树 }else{ //根指针出栈, 访问根结点, 遍历右子树 pb = stack_pop(&stk); printf("%d ", pb->data); pb = pb->rchild; } }}/* 中序遍历非递归算法 */void InOrderTraverse(BiTree* pBiTree){ Stack stk; BiTree* pb = NULL; stack_init(&stk);//保存结点的栈 stack_push(&stk, pBiTree);//根指针进栈 while(!stack_is_empty(&stk)){ while((pb=stack_get_top(&stk))) stack_push(&stk, pb->lchild);//向左走到尽头 pb = stack_pop(&stk);//最后一个空指针出栈 if(!stack_is_empty(&stk)){ pb = stack_pop(&stk);//得到最后一个结点/左孩子 printf("%d ", pb->data); stack_push(&stk, pb->rchild);//访问右孩子 } }}/* 后序遍历非递归算法 */void PostOrderTraverse(BiTree* pBiTree){ Stack stk; BiTree* pb = NULL; BiTree* pre = NULL; stack_init(&stk); while(pBiTree || !stack_is_empty(&stk)){ while(pBiTree){ stack_push(&stk, pBiTree); pBiTree = pBiTree->lchild; } pBiTree = stack_get_top(&stk); if(!pBiTree->rchild || pBiTree->rchild == pre){ printf("%d ", pBiTree->data); stack_pop(&stk); pre = pBiTree; pBiTree = NULL; }else{ pBiTree = pBiTree->rchild; } }}/* 后序遍历递归算法 */void PostOrderTraverse2(BiTree* pBiTree){ if(pBiTree){ PostOrderTraverse(pBiTree->lchild); PostOrderTraverse(pBiTree->rchild); printf("%d ", pBiTree->data); }}int main(void){ BiTree* pbt = NULL; bitree_create(&pbt); printf("\n"); printf("先序遍历非递归算法:\t"); PreOrderTraverse(pbt); printf("\n"); printf("先序遍历递归算法:\t"); PreOrderTraverse2(pbt); printf("\n"); printf("中序遍历非递归算法:\t"); InOrderTraverse(pbt); printf("\n"); printf("中序遍历递归算法:\t"); InOrderTraverse2(pbt); printf("\n"); //printf("中序遍历递归算法2:\t"); //InOrderTraverse3(pbt); //printf("\n"); printf("后序遍历非递归算法:\t"); PostOrderTraverse(pbt); printf("\n"); printf("后序遍历递归算法:\t"); PostOrderTraverse2(pbt); printf("\n"); printf("\n"); bitree_free(pbt); system("pause"); return 0;}
0 0
- 二叉树的反转,递归实现和非递归实现。
- 二叉树的遍历:递归和非递归实现
- 二叉树遍历的递归和非递归实现
- 二叉树创建、遍历的递归和非递归实现
- 二叉树遍历输出的递归和非递归实现
- 二叉树的深度,递归和非递归实现
- 二叉树的遍历(非递归和递归实现)
- 二叉树的前中后序遍历-递归和非递归实现
- 二叉树的递归和非递归实现 java
- 二叉树遍历的递归和非递归实现
- 二叉树的遍历实现(递归和非递归)
- 递归和非递归实现二叉树的后续遍历
- Python实现二叉树的递归和非递归遍历
- 二叉树的递归和非递归实现
- 二叉树的遍历---递归和非递归实现
- 二叉树递归和非递归访问的实现
- 二叉树的递归和非递归
- 二叉树的递归和非递归
- Android服务注册完整过程源码分析
- 理解git fetch ,git pull
- 用户id取模分表获取数据
- JQuery ajax()使用提交表单数据
- 掌握 tar 命令让你秒变大牛
- 二叉树的递归和非递归实现
- 常用模块——sys,pickle,json
- Android服务查询完整过程源码分析
- willSet didSet
- ionic 禁止页面缓存的两个方法
- jquery 滚动条滚动到底部
- ajax瀑布流分页
- 黑白棋(aphabeta剪枝算法的应用)带界面
- spring四种依赖注入方式