二叉树的创建和递归遍历和非递归遍历

如何利用前序遍历序列和中序遍历序列非递归的创建二叉树 说到二叉树的创建,我们一般会想到用递归的方法,因为利用递归写的代码看起来很简洁,但是递归的使用也同样存在效率不够高的问题。所以这里我们要说的是如何利用前序遍历序列和中序遍历序列非递归的创建二叉树。 思想:利用两个栈实现(当然也可以用一个栈,这里针对自己的数据类型),一个栈s用来存放树的各个结点,另一个栈isindex用来存放第一个栈中元素对应于中序序列中的下标。首先,我们先将根结点(即前序序列中的 阅读详情
// 二叉树789.cpp : 定义控制台应用程序的入口点。
//



// 极限二叉树.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define maxsize 100


//树的结构体
typedef struct tree{
char data;
struct tree *left;
struct tree *right;
}*ptree, tnode;


//栈的数据结构
typedef struct stack{
ptree num[100];
int top;
}*pstack, snode;


//队列结构体
typedef struct queue{
ptree num1[100];
int front;
int rear;
}*pqueue, qnode;


//初始化队列
pqueue init1()
{
pqueue q;
q = (pqueue)malloc(sizeof qnode);
q->front = q->rear = 0;
return q;
}


//判断队列是否为空
int isempty1(pqueue q)
{
if (q->front == q->rear)
return 1;
else
return 0;
}


//进队操作
int enqueue(pqueue q, ptree t)
{
if (q->rear == maxsize - 1)
{
printf("队列已经满了!\n");
return 0;
}
else
{
++q->rear;
q->num1[q->rear] = t;
}
return 1;
}


//出队操作
ptree outqueue(pqueue q)
{
ptree temp;
if (q->front == q->rear)
{
printf("队列为空!\n");
return 0;
}
else
{
++q->front;
temp = q->num1[q->front];
return temp;
}
}


//初始化栈
pstack init()
{
pstack p;
p = (pstack)malloc(sizeof snode);
p->top = -1;
return p;
}


//判断栈空
int isempty(pstack p)
{
if (p->top == -1)
return 1;
else
return 0;
}


//入栈操作
int pushstack(pstack p, ptree t)
{
if (p->top + 1 == maxsize)
{
printf("栈已经满了!\n");
return 0;
}
else
{
p->top = p->top + 1;
p->num[p->top] = t;
}
return 1;
}


//出栈操作
ptree popstack(pstack p)
{
ptree itme;
if (p->top == -1)
{
printf("栈为空!\n");
return 0;
}
else
{
itme = p->num[p->top];
p->top = p->top - 1;
}
return itme;
}


//返回栈顶元素
ptree gettop(pstack p)
{
return p->num[p->top];
}


//树的先序创建
ptree create(ptree t)
{
char ch;
scanf("%c", &ch);
if (ch == ',')
{
t = NULL;
return NULL;
}
else
{
t = (ptree)malloc(sizeof tnode);
t->data = ch;
t->left = create(t->left);
t->right = create(t->right);
}
return t;
}


//层序生成二叉树
ptree create1()
{
char ch;
ptree t;
pqueue q;
q = init1();
scanf("%d", &ch);
if (ch == ',')
{
t = NULL;
return t;
}
else
{
t = (ptree)malloc(sizeof tnode);
t->data = ch;
enqueue(q, t);
}
while (!isempty1(q))
{
t = outqueue(q);
scanf("%c", &ch);
if (ch == ',')
t->left = NULL;


else{
t->left = (ptree)malloc(sizeof tnode);
t->left->data = ch;
enqueue(q, t->left);
}
scanf("%c", &ch);
if (ch == ',')
t->right = NULL;
else
{
t->right = (ptree)malloc(sizeof tnode);
t->right->data = ch;
enqueue(q, t->right);
}
}
return t;
}


//递归先序遍历二叉树
void preorder(ptree t)
{
if (t){
printf("%c", t->data);
preorder(t->left);
preorder(t->right);
}
}


//非递归先序遍历二叉树
void preorder1(ptree t)
{
pstack p;
p = init();
while (t || !isempty(p))
{
while (t)
{
printf("%c", t->data);
pushstack(p, t);
t = t->left;
}
if (!isempty(p))
{
t = popstack(p);
t = t->right;
}
}
}


//树的递归中序遍历
void midorder(ptree t)
{
if (t){
midorder(t->left);
printf("%c", t->data);
midorder(t->right);
}
}


//树的非递归中序遍历
void midorder1(ptree t)
{
pstack p;
p = init();
while (t || !isempty(p))
{
while (t)
{
pushstack(p, t);
t = t->left;
}
if (!isempty(p))
{
t = popstack(p);
printf("%c", t->data);
t = t->right;
}
}
}


//树的递归后序遍历
void aftorder(ptree t)
{
if (t)
{
aftorder(t->left);
aftorder(t->right);
printf("%c", t->data);
}
}


//非递归后序遍历
void aftorder1(ptree t){
ptree at;
pstack p;
p = init();
at = t;
int tag[100];
while (at || !isempty(p))
{
while (at)
{
pushstack(p, at);
tag[p->top] = 0;
at = at->left;


}
while (!isempty(p) && tag[p->top])
{
at = popstack(p);
printf("%c", at->data);
}
if (!isempty(p))
{
tag[p->top] = 1;
at = gettop(p);
at = at->right;
}
else
break;
}
}


//层序遍历
void printfloor(ptree t)
{
pqueue q;
q = init1();
ptree at;
at = t;
if (at)
enqueue(q, at);
while (!isempty1(q))
{
at = outqueue(q);
printf("%c", at->data);
if (at->left)
enqueue(q, at->left);
if (at->right)
enqueue(q, at->right);
}
}
//主函数
int main()
{
ptree t;
t = NULL;
printf("请你输入你要创建二叉树输入的数据:\n");
t = create(t);
// printf("层序创建二叉树:\n");
// t = create1();
printf("递归前序遍历是:\n");
preorder(t);
printf("\n");
printf("非递归先序遍历二叉树是:\n");
preorder1(t);
printf("\n");
printf("递归中序遍历二叉树:\n");
midorder(t);
printf("\n");
printf("非递归中序遍历二叉树:\n");
midorder1(t);
printf("\n");
printf("树的递归后序遍历:\n");
aftorder(t);
printf("\n");
printf("树的非递归后序遍历:\n");
aftorder1(t);
printf("\n");
printf("树的层序遍历是:\n");
printfloor(t);
printf("\n");




return 0;
}
二叉树的创建与三种遍历的递归与非递归实现 二叉树的创建与三种遍历的递归与非递归实现 包括二叉树的动态创建,前序遍历,中序遍历,后续遍历的递归与非递归方法的实现。 立即下载

相关推荐

二叉树的创建和各种遍历递归和非递归

二叉树的基本操作,C语言编码,包括二叉树的创建,非递归先序中序和后序遍历,叶子结点的数目以及求树的高度

数据结构 二叉树的建立和递归遍历

一、二叉树的建立 1.1 概念 每一个节点最多有两个节点的树 1.2 二叉树的建立 普通节点 节点的权值: int value 左子节点 : node Lnode; 右子节点 : node rnode; package imitate_tree; public class node { int value; node Lnode; node Rnode; public int ...

初心魏的博客 1325

企业微信审批流开发避坑指南:从零搭建自定义审批模板(含完整代码)

本文为企业微信审批流开发提供了从零搭建自定义审批模板的完整指南。通过对比内置模板与自建引擎的优劣,详细阐述了利用企业微信开放API和自建应用实现高度灵活审批流程的方案。文章重点解析了前端JS-SDK安全调用、后端签名生成与回调处理的核心代码,并分享了流程引擎设计、安全加固及性能监控等实战经验,帮助企业开发者避开常见陷阱,构建贴合业务的自定义审批系统。

weixin_28358083的博客 969

二叉树的创建及递归遍历

第五章 二叉树代码实现 根据递归的思想实现二叉树的三种遍历; 先序遍历 先遍历根节点其次左子树和右子树 中序遍历 先遍历左子树其次根节点最后右子树 后序遍历 先左子树再右子树最后根节点 看个例子 先序遍历结果 1 2 4 6 3 5 (根左右) 1是根 2 4 6 是左子树 3 5 是右子树 中序遍历结果 2 6 4 1 3 5 (左根右) 2 6 4 是左子树 1 是根 3 5 是右子树 后序遍历结果 6 4 2 5 3 1 (

zmm0628的博客 996

第五章 PCIe介绍 5.1-5.7

为什么SSD要用PCIe接口?因为它快,比SATA快。通道,PCIe最多可以有32个通道。两个设备之间的PCIe连接,叫做一个Link。如下图,设备A和设备B是个双向连接,两个PCIe设备之间,有专门的发送和接收通道,数据可以同时往两个方向传输,PCIe Spec称这种工作模式为,可以理解为。和PCIe一样,SATA有独立的发送和接收通道。但与PCIe工作模式不一样,同一时间,SATA只有一条通道可以进行数据传输。这种工作模式称为。与SATA单通道不同,PCIe连接可以通过增加通道数扩展带宽。

fengbaobaola的博客 2969

Avalonia使用CefNet 实现web-browsers(基于CentOS8 Arm64架构)

Avalonia使用CefNet 实现web-browsers(基于CentOS8 Arm64架构)

confused_kitten的博客 3803

二叉树的创建及遍历方法

在这里我们发现,我们每次存储时,基本上都是按照从上到下,从左到右的方式进行存储的,所以,我们此处存储数据时,可以先把根节点下面的左子树先存放完成,再存放右子树即可实现数据存储,并且,我们存放玩上一个数据之后的每一个节点都可以看做是一个根节点。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左孩子树和右孩子树组成的非空树;按照一般的存储逻辑,我们一般存储都是按照如下编号逐个存储,但是这样的存储方式不太适用于我们的链式存储,因此,这里我们需要使用到递归存储。......

m0_45901455的博客 4万+

常见的AXI总线仲裁器概述-AXI协议理解(一)

SoC 设计广泛采用共享总线式的片上通信,其中的仲裁器是共享总线的关键技术之一。AMBA AXI 总线协议以高性能、高频率的系统设计为目标,适合高带宽、低延迟的系统设计,可以达到高频率的操作而不需要复杂的总线桥,满足众多部件的接口要求,具备高度灵活的互联结构,并且向后兼容 AHB 和 APB 接口。

Paul 安的博客 1万+

二叉树的创建和遍历

二叉树的创建可以选择顺序存储方式创建二叉树和链式存储方式创建二叉树。我们为了创建一棵完整的二叉树,需要对普通的二叉树进行拓展,如图所示:其实建立二叉树也是利用了递归的原理。只不过在原来应该是打印结点的地方,改成了生成结点,给结点赋值的操作而已。大家可以先看后面的二叉树的遍历,再来看二叉树的创建。

zuojiejie的博客 7474

ANSYS_APDL实战入门——从零开始掌握模态分析

本文为ANSYS APDL模态分析实战入门指南,通过一个悬臂梁案例,手把手教你从零开始掌握APDL命令流。内容涵盖从模型创建、材料定义、网格划分到边界条件设置、求解及后处理结果查看的全流程,帮助工程师快速上手结构动力学分析,避免共振风险。

egg99的博客 1132

PGM-Explainer实验总结

PGM-Explainer建立了一个概率图模型,为GNN提供实例级解释。 论文标题:PGM-Explainer: Probabilistic Graphical Model Explanations for Graph Neural Networks 论文地址:2010.05788.pdf (arxiv.org) PGM-Explainer实验 实验目的 研究PGM-Explainer的有效性 实验方案 合成数据集的节点分类 与其他解释器做对比实验 使用六个合成数据集。 每个输入图都是一个

笔记|思路|总结 1万+

从键盘输入先序序列,创建二叉树,然后对T进行非递归中序遍历、递归后序遍历和层序遍历

数据结构之二叉树操作 算法思想 1、创建二叉树:使用递归的方法。从键盘输入一个字符,判断其是否为空字符,本代码用’#'代替空字符。如果是,则该节点赋值NULL;如果不是,则该节点的数据域data赋值为该字符,同时调用函数自身,传入左孩子指针,继续调用函数自身,传入右孩子指针。 2、非递归中序遍历方法1:先将根节点压入栈中。当栈非空时,当获取栈顶元素的栈顶元素不为空时,将栈顶元素的左节点压入栈中;继续判断栈非空,弹出栈顶元素,输出元素的数据域,再将元素的右节点压入栈中。 3、递归后序遍历:判断节点非空,如果空

m0_46560176的博客 7957

提示词驱动的智能合同生成与审核

第1章:核心概念与背景 1.1.1 问题背景 1.1.1.1 合同生成与审核的需求 合同作为商业和法律领域中的基本工具,其生成和审核过程至关重要。传统的合同生成往往依赖于法律专业人士的手工撰写,这不仅耗时耗力,而且容易出现错误。此外,合

AI天才研究院 1002

二叉树的(使用链表)创建及(递归和非递归)遍历

一、使用链表前序遍历创建二叉树(递归) 步骤 创建二叉树函数,以根节点作为返回值; 创建一棵二叉树结点,并初始化; 为此二叉树结点申请存储空间; 向数据域输入元素数据; 考虑终止条件:当输入特殊字符’0’时,停止创建,即二叉树元素输入完毕; 循环体中:访问左子树(调用函数自身);访问右子树(调用函数自身); 循环体外,返回根节点。 二、二叉树的遍历 递归:前序、中序、后续 前序递归遍历: 若被遍历的二叉树非空,则: 访问根结点; 以前序遍历原则遍历根结点的左子树; 以前序遍历原则遍历根结点的右子树。

zhouyinuo1998的博客 1121

PCL RANSAC拟合分割多条直线【2026最新版】

使用RANSAC算法拟合分割多条直线,输出每一条直线的拟合参数到控制台,并保存直线点云到本地文件夹。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 7974

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

二叉树的创建与遍历(递归和非递归)

最近学到了二叉树,把二叉树的实现算法记录下来 #include<iostream> using namespace std; #define maxsize 20 typedef char elemtype; int num = 0; class binode { public: elemtype data; binode * right; binode * left; }; t...

卖核弹的小男孩 的博客 314

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

二叉树的创建及递归和非递归遍历

一直知道个大概,没动手实现过,今天自己

学习印记 Learning imprint 2543

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

二叉树的创建和递归、非递归遍历

复习一下二叉树 二叉树的叶子结点总是比双分支结点多一个。 满二叉树:如果有H层,则总结点个数为2H(次方)-1,每一层有2H-1(次方)个结点。 二叉树的创建 结点信息 typedef struct node{ int data; // 存放此结点的值 struct node * left; // 指向此结点的左子女 struct node * right; // 指向此结点...

weixin_42325110的博客 358

C语言和C++实现二叉树的#创建以及非递归遍历

尝试多次并学习了别人的程序后,实现了C和C++的井号创建法(注意直接在控制台的同一行输入所有字符,最后要多加一个#号),不传参的写法比较简单(左右子树要递归赋值),传参的话在C程序中需要用到二级指针而且递归内部的写法不同(不赋值,递归处理左右子树),在C++程序中用引用更加方便。遍历仍然是使用STL的pair和stack容器。

hou19975418的博客 293

二叉树的基本操作(创建、递归和非递归遍历、求深度、求叶子数)

1、创建 递归地调用即可 顺便注意一下,C中指针作为函数的参数和返回值 在上面的函数中传递的是一个指向指针的指针,以使函数中使用malloc来动态地分配空间。 如果直接使用指针则不行,因为编译器要为每个函数参数制作临时副本,对于指针也不例外,它的副本即是实参所指向对象的内存地址,如果函数中修改了形参指向的内容,实参所指向的内容也作了相应的修改,这就是为什么指针可以用作输出参数的原因

simon、夏不弃疗 2347

二叉树的创建,以及递归方式遍历和非递归方式遍历(Java)

二叉树的遍历方式主要分为两类:深度优先遍历和广度优先遍历,前者包括前序遍历,中序遍历和后序遍历;后者主要指层序遍历。这篇文章中,我们先对二叉树的创建和每个遍历过程的思路进行分析,然后在文章最后给出一个完整的代码供参考。 目录 二叉树的创建 前序遍历(递归方式) 前序遍历(非递归) 中序遍历(非递归) 后序遍历(非递归) 层序遍历(非递归) 完整代码 二叉树的创建 我们这里用前序...

长林攻城狮的博客 791

二叉树的创建及基本操作(三种递归遍历算法和非递归中序遍历算法,统计二叉树的叶子结点及求二叉树的深度)

二叉树的创建及基本操作 内容: 1.利用二叉树的二叉链表存储方法按照先序遍历序列创建二叉树,实现三种递归遍历算法。 2.编写统计二叉树的叶子结点及求二叉树深度的算法(可用递归方法)。 3.实现二叉树的非递归中序遍历算法。 二叉链表存储表示: typedef struct BiTNode{ TElemType data; struct BiTNode *lchild, *rchild; } BiTNode,*BiTree; 算法设计及程序源代码 二叉树的创建算法(按先序遍历序列创建):

help_child的博客 5230

二叉树的创建和非递归先中后遍历

二叉树的创建和非递归遍历 import org.junit.Test; import java.util.Stack; public class createTree { Node root = null; /** * 创建 * @param data */ public void add1(int data){ Nod

菜鸟题巢 360

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

创建:先序输入,空格代表结点为空。递归遍历:中序遍历。非递归遍历:中序遍历,顺序栈。非递归思路:对于每个结点,有且只有一次应用函数操作的机会,所以操作之后就出栈。具体为:结点不为空就读取左孩子,直到左孩子为空;栈顶结点出栈,对出栈的结点应用函数操作;查看出栈结点的右孩子。#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; typedef struct ...

qbc_Schnappi的博客 328

DS--二叉树的创建和七种遍历方式,包括三种递归的前中后序遍历和三种非递归的前中后序遍历以及层次遍历

二叉树: 二叉树的遍历实现 声明文件Bintree.h #ifndef _BINTREE_H_ #define _BINTREE_H_ #include<stdio.h> #include<string.h> #include<Windows.h> #define ENDTAG '#' typedef char BTDataType; typedef st...

烟华的博客 330

【二叉树】Python 从List创建二叉树及4种遍历的递归和非递归实现

# -*- coding: UTF-8 -*- from collections import deque class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None class Tree: def __ini...

kikajack的博客 4234
上一篇: 链队列的初始化,入队,出队,计算队的长度,遍历链队销毁队列
下一篇: 二叉搜索树的创建及其遍历
一代掌门
博客等级 码龄12年 9粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值