#include <stdio.h>
#include <stdlib.h>
#define maxValue 1000
struct binTreeNode{
int data;
binTreeNode * left,*right;
};
binTreeNode * root;
/*
递归创建二叉树,返回根节点指针
输入要求:类似先根遍历的输入顺序,如果哪个节点的孩子为空,那么输入0
例如针对
1
2 3
4 5 6 7
输入顺序为:
1 2 4 0 0 5 0 0 3 6 0 0 7 0 0
针对 1
2 3
4 5 0 7
输入顺序为:
1 2 4 0 0 5 0 0 3 0 7 0 0
*/
binTreeNode * recCreateBinTree()
{
int _data = 0;
binTreeNode * r;
scanf("%d",&_data);
if(_data == 0)
r = NULL;
else
{
r = (binTreeNode*)malloc(sizeof(binTreeNode));
r->data = _data;
r->left = recCreateBinTree();
r->right = recCreateBinTree();
}
return r;
}
/*
递归版本的先根遍历
*/
void recPreOrder(binTreeNode *root)
{
if(root != NULL)
{
printf("%d\n",root->data);
recPreOrder(root->left);
recPreOrder(root->right);
}
}
/*
递归版本的中根遍历
*/
void recInOrder(binTreeNode *root)
{
if(root != NULL)
{
recInOrder(root->left);
printf("%d\n",root->data);
recInOrder(root->right);
}
}
/*
递归版本的后根遍历
*/
void recPostOrder(binTreeNode *root)
{
if(root != NULL)
{
recPostOrder(root->left);
recPostOrder(root->right);
printf("%d\n",root->data);
}
}
/*
层次遍历
利用数组模拟队列
但是当元素多于1000时候,不可处理
*/
void leverOrder(binTreeNode * root)
{
binTreeNode * queue[1000];
binTreeNode *tmp;
int head = 0;
int tail = 0;
if(root != NULL)
{
queue[tail] = root; //队列操作,while前边先压入首元素
tail ++ ;
while(tail > head)
{
tmp = queue[head]; //弹出队列头元素
head ++;
printf("%d\n",tmp->data); //针对首元素的操作
//压入后继元素
if(tmp->left != NULL)
{
queue[tail] = tmp->left;
tail ++ ;
}
if(tmp->right != NULL)
{
queue[tail] = tmp->right;
tail ++;
}
}
}
}
/*
层次遍历
利用数组模拟队列
而且利用取余,模拟循环队列
*/
void leverOrder2(binTreeNode * root)
{
binTreeNode * queue[maxValue];
binTreeNode *tmp;
int head = 0;
int tail = 0;
if(root != NULL)
{
queue[tail] = root; //队列操作,while前边先压入首元素
tail ++ ;
while(tail != head)
{
tmp = queue[head]; //弹出队列头元素
head = (head + 1) % maxValue;
printf("%d\n",tmp->data); //针对首元素的操作
//压入后继元素
if(tmp->left != NULL)
{
queue[tail] = tmp->left;
tail = (tail + 1)% maxValue;
}
if(tmp->right != NULL)
{
queue[tail] = tmp->right;
tail = (tail + 1)% maxValue;
}
}
}
}
int main()
{
freopen("in.txt","r",stdin);
root = recCreateBinTree();
fclose(stdin);
printf("preOrder:\n");
recPreOrder(root);
printf("inOrder:\n");
recInOrder(root);
printf("postOrder:\n");
recPostOrder(root);
printf("leverOrder:\n");
leverOrder2(root);
return 0;
}
分享到:
相关推荐
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
二叉树的创建与三种遍历的递归与非递归实现 包括二叉树的动态创建,前序遍历,中序遍历,后续遍历的递归与非递归方法的实现。
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
中根顺序递归建立二叉树,递归及非递归遍历二叉树。C++面向过程实现
递归先序遍历二叉树: 递归中序遍历二叉树: 递归后序遍历二叉树: 非递归先序遍历二叉树: 非递归中序遍历二叉树: 非递归后序遍历二叉树: 非递归中序遍历二叉树(算法2): 层次遍历二叉树: 递归计算单...
常见的二叉树遍历方法有三种:先序遍历、中序遍历和后序遍历。下面我们将讨论这三种遍历方法的非递归算法。 一、先序遍历非递归算法 先序遍历是指先访问根结点,然后访问左子树,最后访问右子树。非递归算法使用栈...
二叉树遍历是计算机科学中处理二叉树数据结构的一种基本操作,它涉及到访问二叉树中的每个节点。在二叉树中,每个节点最多有两个子节点,通常分为左子节点和右子节点。遍历二叉树的目的是按照某种顺序访问所有节点,...
二叉树深度 二叉树前序遍历 递归实现 二种非递归实现 二叉树中序遍历: 递归实现 非递归实现 二叉树后序遍历: ...二叉树层次创建,创建方法遵循卡特兰数 http://write.blog.csdn.net/postedit/17380455
本资料“数据结构 二叉树三种遍历的非递归算法(背诵版)”着重介绍了二叉树的三种主要遍历方法——前序遍历、中序遍历和后序遍历的非递归实现。 **前序遍历**: 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。非...
按先序遍历的扩展序列建立二叉树的二叉链表存储结构,实现二叉树先序、中序、后序遍历的递归算法,实现二叉树中序遍历的非递归算法,实现二叉树层次遍历的非递归算法(要求使用顺序队列,调用顺序队列基本操作...
在本主题中,我们将深入探讨如何使用C语言实现二叉树的创建、不同类型的遍历(递归与非递归)以及计算叶子节点的数量和树的高度。 首先,我们来创建一个二叉树的节点结构。在C语言中,可以定义一个结构体类型,如下...
二叉树的三种遍历,递归与非递归,按层。适合初学者。
前序遍历是二叉树遍历的一种方式,其顺序为“根节点 -> 左子树 -> 右子树”。具体而言,在遍历过程中,首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。对于非递归的前序遍历,通常会利用栈来辅助实现...
### 二叉树先序、中序、后序遍历非递归算法 #### 前言 在计算机科学中,二叉树是一种常见的数据结构,它被广泛应用于各种算法和程序设计中。二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:...
中序遍历是一种常用的二叉树遍历算法,它首先遍历左子树,然后遍历根节点,最后遍历右子树。在这个代码中,我们使用栈来实现非递归中序遍历算法。 int InOrderTraverse(BiTree T){ BiTree p; sqstack L; ...
在二叉树遍历中,我们利用函数调用自身来处理树的不同部分。 1. **前序遍历**(根-左-右): - 递归版本:首先访问根节点,然后递归遍历左子树,最后递归遍历右子树。 - 非递归版本:使用栈来模拟递归过程。首先...
我们首先定义了二叉树结点的结构体,然后实现了创建二叉树、先序遍历、中序遍历和后序遍历的函数。最后,我们使用switch语句来选择不同的遍历方式。 在实际应用中,二叉树的遍历有很多应用,如数据库查询、图形遍历...
二叉树遍历是理解和操作二叉树的关键技能,通常包括三种主要的递归方法:前序遍历、中序遍历和后序遍历,以及一种非递归方法——层次遍历。本资源"遍历二叉树的4个非递归算法.rar"提供了C#语言实现的这四种非递归...
二叉树的非递归遍历,使用C++实现二叉树的非递归遍历,对正在学习算法的同学应该挺有帮助的