c语言非递归先序遍历二叉链表,C语言非递归后序遍历二叉树

搜索热词

本文实例为大家分享了C语言非递归后序遍历二叉树的具体代码,供大家参考,具体内容如下

法一:实现思路:一个栈 先按 根->右子树->左子树的顺序访问二叉树。访问时不输出。另一个栈存入前一个栈只进栈的结点。

最后输出后一个栈的结点数据。

#include

#include

typedef struct TreeNode{

char element;

struct TreeNode *left,*right;

}Tree,*BTree;

typedef struct StackNode{

BTree data;

struct StackNode *next;

}Stack,*PStack;

typedef struct{

PStack top;

}LinkStack,*PLinkStack;

//初始化空栈

PLinkStack Init_Stack(void){

PLinkStack S;

S=(PLinkStack)malloc(sizeof(LinkStack));

if(S){

S->top=NULL;

}

return S;

}

//压栈

void Push_Stack(PLinkStack S,BTree T){

PStack p;

p=(PStack)malloc(sizeof(Stack));

p->data=T;

p->next=S->top;

S->top=p;

}

//判空

int empty_Stack(PLinkStack S){

if(S->top){

return 0;

}else{

return 1;

}

}

//出栈

PStack Pop_Stack(PLinkStack S){

PStack q;

if(empty_Stack(S)){

return S->top;

}else{

q=S->top;

S->top=S->top->next;

}

return q;

}

//销毁栈

void DestroyStack(PLinkStack S){

PStack del;

while(S->top!=NULL){

del=S->top;

S->top=S->top->next;

free(del);

}

free(S);

}

BTree BuildTree(void){

char ch;

BTree node;

ch=getchar();

if(ch=='#'){

node=NULL;

}else{

node=(BTree)malloc(sizeof(Tree));

node->element=ch;

node->left=BuildTree();

node->right=BuildTree();

}

return node;

}

void NotRecursionPostOrder(BTree T){

PLinkStack S,CS;

S=Init_Stack();

CS=Init_Stack();

while(T || !empty_Stack(S)){

if(T){

Push_Stack(S,T);

Push_Stack(CS,T);

T=T->right;

}else{

T=Pop_Stack(S)->data;

T=T->left;

}

}

while(CS->top!=NULL){

printf("%c",CS->top->data->element);

CS->top=CS->top->next;

}

DestroyStack(CS);

}

int main(void){

BTree T;

T=BuildTree();

NotRecursionPostOrder(T);

return 0;

}

15086025941.jpg?2017921111315

法二:实现思路。按先序遍历访问每一个结点。存入栈中,当为空时,就出立即栈(第一次出栈)。出栈后应该立即进栈,去访问进栈结点的右结点,这样可以保证先输出左、右结点,再输出根结点。二次进栈利用flag标记。

#include

#include

typedef struct TreeNode {

char element;

int flag;

struct TreeNode *left,*BTree;

typedef struct StackNode {

BTree data;

struct StackNode *next;

}Stack,*PStack;

typedef struct {

PStack top;

}LinkStack,*PLinkStack;

//初始化空栈

PLinkStack Init_Stack(void) {

PLinkStack S = (PLinkStack)malloc(sizeof(LinkStack));

if (S) {

S->top = NULL;

}

return S;

}

//压栈

void Push_Stack(PLinkStack S,BTree T) {

PStack p;

p = (PStack)malloc(sizeof(Stack));

p->data = T;

p->next = S->top;

S->top = p;

}

//判空

int empty_Stack(PLinkStack S) {

if (S->top) {

return 0;

}

else {

return 1;

}

}

//出栈

PStack Pop_Stack(PLinkStack S) {

PStack q = S->top;

S->top = S->top->next;

return q;

}

BTree BuildTree(void) {

BTree t;

char ch;

ch = getchar();

if (ch == '#') {

t = NULL;

}

else {

t = (BTree)malloc(sizeof(Tree));

t->element = ch;

t->left = BuildTree();

t->right = BuildTree();

}

return t;

}

void DestroyStack(PLinkStack S){

PStack p;

while(S->top){

p=S->top;

free(p);

S->top=S->top->next;

}

}

void NotRecursionPostOrder(BTree T) {

PLinkStack S;

S = Init_Stack();

while (T || !empty_Stack(S)) {

if (T) {

T->flag = 0;

Push_Stack(S,T);

T = T->left;

}

else {

T = Pop_Stack(S)->data;

if (T->flag == 0) {

T->flag = 1;

Push_Stack(S,T);

T = T->right;

}

else {

if (T->flag == 1) {

printf("%c",T->element);

T = NULL;

}

}

}

}

DestroyStack(S);//销毁栈

}

int main(void) {

BTree T;

T = BuildTree();

NotRecursionPostOrder(T);

return 0;

}

15086025952.jpg?2017921111337

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是编程之家为你收集整理的C语言非递归后序遍历二叉树全部内容,希望文章能够帮你解决C语言非递归后序遍历二叉树所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值