问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

二叉树遍历程序

提问网友 发布时间:2022-04-22 02:34
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
2个回答
热心网友 回答时间:2022-04-18 22:58
二叉树的遍历有3种方式:

a
/ \
/ \
b e
/ \ \
/ \ \
c d f

(先序)先根遍历:(根左右)先访问根,再访问左子树,最后访问右子树,则可得如下的序列:abcdef

(中序)中根遍历:(左根右)先访问左子树,再访问根,最后访问右子树,则可得如下的序列:cbdaef

(后序)后根遍历:(左右根)先访问左子树,再访问右子树,最后访问根,则可得如下的序列:cdbfea

本文给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法。

1.先序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree Elem[maxsize];
int top;
}SqStack;

void PreOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;

while (p!=null || !StackEmpty(s))
{
while (p!=null) //遍历左子树
{
visite(p->data);
push(s,p);
p=p->lchild;
}//endwhile

if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历
{
p=pop(s);
p=p->rchild;
}//endif

}//endwhile

}//PreOrderUnrec

2.中序遍历非递归算法
#define maxsize 100
typedef struct
{
Bitree Elem[maxsize];
int top;
}SqStack;

void InOrderUnrec(Bitree t)
{
SqStack s;
StackInit(s);
p=t;
while (p!=null || !StackEmpty(s))
{
while (p!=null) //遍历左子树
{
push(s,p);
p=p->lchild;
}//endwhile

if (!StackEmpty(s))
{
p=pop(s);
visite(p->data); //访问根结点
p=p->rchild; //通过下一次循环实现右子树遍历
}//endif

}//endwhile

}//InOrderUnrec

3.后序遍历非递归算法
#define maxsize 100
typedef enum tagtype;
typedef struct
{
Bitree ptr;
tagtype tag;
}stacknode;

typedef struct
{
stacknode Elem[maxsize];
int top;
}SqStack;

void PostOrderUnrec(Bitree t)
{
SqStack s;
stacknode x;
StackInit(s);
p=t;

do
{
while (p!=null) //遍历左子树
{
x.ptr = p;
x.tag = L; //标记为左子树
push(s,x);
p=p->lchild;
}

while (!StackEmpty(s) && s.Elem[s.top].tag==R)
{
x = pop(s);
p = x.ptr;
visite(p->data); //tag为R,表示右子树访问完毕,故访问根结点
}

if (!StackEmpty(s))
{
s.Elem[s.top].tag =R; //遍历右子树
p=s.Elem[s.top].ptr->rchild;
}
}while (!StackEmpty(s));
}//PostOrderUnrec
热心网友 回答时间:2022-04-19 00:16
然后呢?
假设虚结点输入时以空格字符表示,相应的构造算法为:
void CreateBinTree (BinTree *T)
{ //构造二叉链表。T是指向根指针的指针,故修改*T就修改了实参(根指针)本身
char ch;
if((ch=getchar())=='') *T=NULL; //读人空格,将相应指针置空
else{ //读人非空格
*T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点
(*T)->data=ch;
CreateBinTree(&(*T)->lchild); //构造左子树
CreateBinTree(&(*T)->rchild); //构造右子树
}
}

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

相关推荐
  • python二叉树遍历的实现方法

    python二叉树遍历的实现方法

    python二叉树遍历的实现方法: 代码如下:#!/usr/bin/python# -*- coding: utf-8 -*- class TreeNode(object): def __init__(self,data=0,left=0,right=0): self.data = data self.left = left self.right = right class BTree(
    查看详情
  • 使用JavaScript如何实现二叉树遍历

    使用JavaScript如何实现二叉树遍历

    使用JavaScript如何实现二叉树遍历:这篇文章主要介绍了JavaScript实现二叉树定义、遍历及查找的方法,结合实例形式较为详细的分析了二叉树的相关概念及javascript构建二叉树、遍历、查找二叉树的常用操作技巧,需要的朋友可以参考下本文实例讲述了JavaScript实现二叉树定义、遍历及查找的方法。分
    查看详情
将进酒里“将”是什么意思? 二叉树的遍历问题,高手请进 用“将”字多音字组词 一道二叉树的遍历 将进酒中“将”的发音 将进酒的“将”字是什么意思 二叉树遍历 如何把一个的联系人同步到另一个 “将”在汉语中是什么词性 怎么把一个微信的手机号转到另一个上? 将字的含义是什么 怎么把一个的数据转到另一个的数据? 将字能组什么词 “将”的多音字怎么组词(两个都要) 将字有几个读音 如何将微信好友转移到另一个? 将的笔顺是什么 登陆人人网时总是要重复输入密码怎么回事 将多音字组词 为什么我的人人网每天都要改密码 。每天登陆都说要... 将字多音字组词 2叉树遍历 《木兰诗》中 “将”字的意思 二叉树的遍历问题 遍历二叉树 java 2叉树的遍历 二叉树的遍历是什么意思? C# 遍历2叉树的语句 1.二叉树的遍历(难度****) quartusⅡ9 中entity框图被叉掉如何找回,个种键都... 建筑材料员,要哪些证书? 工地安全员和材料员要有哪些证件 施工员证,资料员证,材料员有用吗? 资料员和材料员都需要什么证书啊? 天天p图在扣图中如何不使用背景图片 天天抠图软件抠好图怎样保存 缺血再灌注损伤是怎么导致的? 再灌注损伤是什么?有什么影响?类型是什么? 试述心肌缺血/再灌注损伤的机制. 缺血再灌注损伤的机制是啥?
Top