二叉树创建、中序遍历(递归和非递归)

本文详细介绍了如何创建二叉树,并探讨了两种中序遍历方法:递归和非递归。通过实例代码,帮助读者深入理解二叉树的遍历技巧及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建:先序输入,空格代表结点为空。
递归遍历:中序遍历。

非递归思路:对于每个结点,有且只有一次应用函数操作的机会,所以操作之后就出栈。具体为:结点不为空就读取左孩子,直到左孩子为空;栈顶结点出栈,对出栈的结点应用函数操作;查看出栈结点的右孩子。

#include<stdio.h>#include<stdlib.h>typedef struct BiTNode{char data;//数据struct BiTNode *lchild;//左孩子struct BiTNode *rchild;//右孩子}BiTNode,*BiTree;typedef struct Stack{BiTNode *base;//栈底BiTNode *top;//栈顶}Stack;void PrintElement(char e);//打印函数char *CreateBiTree(char *p,BiTree &T);//依次输入二叉树的值,空格表示空void PreOrderTraverse1(BiTree T,void (*Visit)(char e));//递归遍历void PreOrderTraverse2(BiTree T,void (*Visit)(char e));//非递归遍历①int main(){BiTree T=NULL;char *p;p=CreateBiTree("abc d ef g ",T);PreOrderTraverse1(T,PrintElement);putchar('\n');PreOrderTraverse2(T,PrintElement);putchar('\n');return 0;}void PrintElement(char e){printf("%c ",e);return;}char *CreateBiTree(char *p,BiTree &T){char ch=*p;p++;if(ch==' ') T=NULL;else{T=(BiTree)malloc(sizeof(BiTNode));if(T==NULL) exit(0);T->data=ch;p=CreateBiTree(p,T->lchild);p=CreateBiTree(p,T->rchild);}return p;}void PreOrderTraverse1(BiTree T,void (*Visit)(char e)){if(T!=NULL){PreOrderTraverse1(T->lchild,Visit);Visit(T->data);PreOrderTraverse1(T->rchild,Visit);return;}else return;}void PreOrderTraverse2(BiTree T,void (*Visit)(char e)){Stack S;BiTNode *p;S.base=(BiTNode *)malloc(20*sizeof(BiTNode));S.top=S.base;p=T;while(1){if(p!=NULL) {*S.top=*p; S.top++; while(p->lchild!=NULL){
*S.top=*(p->lchild); S.top++; p=S.top-1;}}S.top--;if(S.base==S.top) break;Visit(S.top->data);p=S.top->rchild;}free(S.base);return;}


get非递归里面:
*S.top=*p与S.top=p的效果不一样;
指针变量才能用->,而且得malloc(有具体地址指向),非指针用“.”(属性)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值