数据结构-二叉树的非递归遍历
生活随笔
收集整理的這篇文章主要介紹了
数据结构-二叉树的非递归遍历
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前面的章節(jié)我們實(shí)現(xiàn)了二叉樹最基本的遍歷方式:遞歸遍歷,代碼是如此的簡(jiǎn)潔;辣么我們?yōu)槭裁催€要去學(xué)習(xí)二叉樹的非遞歸遍歷方式呢?眾所周知,遞歸優(yōu)點(diǎn)是將可以將復(fù)雜的問題簡(jiǎn)單化即大問題拆分成一個(gè)個(gè)小問題,那么它的缺點(diǎn)是什么呢?缺點(diǎn)就是效率低。對(duì)于一個(gè)算法來說,其中最重要的一個(gè)點(diǎn)就是效率,如果一個(gè)算法效率低下,辣么它被使用的概率就很低,因?yàn)槲覀兠繒r(shí)每刻都在追求最優(yōu)解~
對(duì)于二叉樹的非遞歸遍歷我們可以借助棧來實(shí)現(xiàn),下面我們給出先序遍歷和中序遍歷非遞歸算法的其中一種:
// // Created by Administrator on 2018/6/5. // /*** 二叉樹的非遞歸遍歷:先序遍歷、中序遍歷*/ #include "stdio.h" #include "stdlib.h"/*** 定義一棵樹*/ typedef struct {char data;struct BitTreeNode *lchild, *rchild; } BitTreeNode, *BitTree;/*** 定義一個(gè)棧*/ #define MaxSize 100 typedef struct {BitTree data[MaxSize];//數(shù)據(jù)域,樹節(jié)點(diǎn)指針int top;//下標(biāo)索引int currentSize;//棧當(dāng)前大小 } Stack2;/*** 初始化棧* @param stack2*/ void initStack2(Stack2 *stack2) {stack2->top = -1;stack2->currentSize = 0; }/*** 入棧操作* @param stack2* @param node*/ void push2(Stack2 *stack2, BitTree node) {if (stack2->currentSize == MaxSize) {//棧已滿printf("很遺憾告訴你:棧已滿~\n");return;}stack2->top++;stack2->data[stack2->top] = node;stack2->currentSize++; }/*** 出棧操作* @param stack2* @return*/ BitTree pop2(Stack2 *stack2) {if (stack2->currentSize == 0) {printf("很遺憾告訴你:棧已空~\n");return NULL;}BitTree node = stack2->data[stack2->top];stack2->top--;stack2->currentSize--;return node; }/*** 前序法創(chuàng)建樹* @param tree* @return*/ BitTree createTree(BitTree tree) {char c;scanf("%c", &c);if (c == '#') {return NULL;} else {tree = (BitTree) malloc(sizeof(BitTreeNode));tree->data = c;tree->lchild = createTree(tree->lchild);tree->rchild = createTree(tree->rchild);}return tree; }/*** 前序法遍歷樹* @param tree* @param s*/ void preOrder2(BitTree tree, Stack2 *s) {if (tree) {printf("%c", tree->data);preOrder2(tree->lchild, s);preOrder2(tree->rchild, s);} }void visit(int data) {printf("%c", data); }/***中序遍歷非遞歸算法* @param tree* @param s*/ void inOrderNoRec(BitTree tree, Stack2 *s) {BitTree p = tree;while (p || s->currentSize > 0) {if (p) {push2(s, p);p = p->lchild;} else {p = pop2(s);visit(p->data);p = p->rchild;}} }/*** 先序非遞歸遍歷* @param tree* @param s*/ void preOrderNoRec(BitTree tree, Stack2 *s) {BitTree p = tree;while (p || s->currentSize > 0) {if (p) {push2(s, p);visit(p->data);p = p->lchild;} else {p = pop2(s);p = p->rchild;}} }int main() {Stack2 stack2;initStack2(&stack2);BitTree tree;tree = createTree(tree);printf("前序遞歸遍歷結(jié)果:\n");preOrder2(tree, &stack2);printf("\n先序非遞歸遍歷結(jié)果:\n");preOrderNoRec(tree, &stack2);printf("\n中序非遞歸遍歷結(jié)果:\n");inOrderNoRec(tree, &stack2); }總結(jié)
以上是生活随笔為你收集整理的数据结构-二叉树的非递归遍历的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitLab 仓库管理 创建一个仓库
- 下一篇: 数据结构-二叉树层次遍历