网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 458|回复: 0
打印 上一主题 下一主题

【数据结构】二叉树先序遍历的非递归实现

[复制链接]

689

主题

696

帖子

3112

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3112
跳转到指定楼层
楼主
发表于 2023-9-5 16:00:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wander 于 2023-9-5 16:02 编辑

二叉树先序遍历的非递归实现

二叉树的先序遍历既可以直接采用递归思想实现,也可以使用栈的存储结构模拟递归的思想实现,以下图所示二叉树为例,其 C 语言实现代码为:




  • #include <stdio.h>
  • #include <string.h>
  • #define TElemType int
  • int top=-1;//top变量时刻表示栈顶元素所在位置
  • //构造结点的结构体
  • typedef struct BiTNode{
  •     TElemType data;//数据域
  •     struct BiTNode *lchild,*rchild;//左右孩子指针
  • }BiTNode,*BiTree;
  • //初始化树的函数
  • void CreateBiTree(BiTree *T){
  •     *T=(BiTNode*)malloc(sizeof(BiTNode));
  •     (*T)->data=1;
  •     (*T)->lchild=(BiTNode*)malloc(sizeof(BiTNode));
  •     (*T)->rchild=(BiTNode*)malloc(sizeof(BiTNode));
  •     (*T)->lchild->data=2;
  •     (*T)->lchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));
  •     (*T)->lchild->rchild=(BiTNode*)malloc(sizeof(BiTNode));
  •     (*T)->lchild->rchild->data=5;
  •     (*T)->lchild->rchild->lchild=NULL;
  •     (*T)->lchild->rchild->rchild=NULL;
  •     (*T)->rchild->data=3;
  •     (*T)->rchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));
  •     (*T)->rchild->lchild->data=6;
  •     (*T)->rchild->lchild->lchild=NULL;
  •     (*T)->rchild->lchild->rchild=NULL;
  •     (*T)->rchild->rchild=(BiTNode*)malloc(sizeof(BiTNode));
  •     (*T)->rchild->rchild->data=7;
  •     (*T)->rchild->rchild->lchild=NULL;
  •     (*T)->rchild->rchild->rchild=NULL;
  •     (*T)->lchild->lchild->data=4;
  •     (*T)->lchild->lchild->lchild=NULL;
  •     (*T)->lchild->lchild->rchild=NULL;
  • }
  • //前序遍历使用的进栈函数
  • void push(BiTNode** a,BiTNode* elem){
  •     a[++top]=elem;
  • }
  • //弹栈函数
  • void pop( ){
  •     if (top==-1) {
  •         return ;
  •     }
  •     top--;
  • }
  • //模拟操作结点元素的函数,输出结点本身的数值
  • void displayElem(BiTNode* elem){
  •     printf("%d ",elem->data);
  • }
  • //拿到栈顶元素
  • BiTNode* getTop(BiTNode**a){
  •     return a[top];
  • }
  • //先序遍历非递归算法
  • void PreOrderTraverse(BiTree Tree){
  •     BiTNode* a[20];//定义一个顺序栈
  •     BiTNode * p;//临时指针
  •     push(a, Tree);//根结点进栈
  •     while (top!=-1) {
  •         p=getTop(a);//取栈顶元素
  •         pop();//弹栈
  •         while (p) {
  •             displayElem(p);//调用结点的操作函数
  •             //如果该结点有右孩子,右孩子进栈
  •             if (p->rchild) {
  •                 push(a,p->rchild);
  •             }
  •             p=p->lchild;//一直指向根结点最后一个左孩子
  •         }
  •     }
  • }
  • int main(){
  •     BiTree Tree;
  •     CreateBiTree(&Tree);
  •     printf("先序遍历: \n");
  •     PreOrderTraverse(Tree);
  • }


运行结果先序遍历:
1 2 4 5 3 6 7






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-25 09:25 , Processed in 0.033361 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表