`
yezhiqiu-love
  • 浏览: 168683 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

二叉树遍历,递归与非递归,前序中序后序遍历,C代码

阅读更多
#include<stdio.h> 
#include<stdlib.h> 
typedef struct bitnode 
{ 
char data; 
struct bitnode *lchild,*rchild; 
}bitnode,*bitree;//二叉树节点类型和节点指针类型 

bitree create()//先序创建 
{ 
bitree root=NULL; 
char c; 
scanf("%c",&c); 
fflush(stdin); 
if(c=='#')return NULL; 
else 
{ 
root=(bitnode*)malloc(sizeof(bitnode)); 
root->data=c; 
root->lchild=create(); 
root->rchild=create(); 
} 
return root; 
} 

void preorder(bitree root)//先根遍历 
{ 
if(!root)return; 
else 
{ 
putchar(root->data); 
preorder(root->lchild); 
preorder(root->rchild); 
} 
} 

void inorder(bitree root)//中根遍历 
{ 
if(!root)return; 
else 
{ 
inorder(root->lchild); 
putchar(root->data); 
inorder(root->rchild); 
} 
} 

void postorder(bitree root)//后根遍历 
{ 
if(!root)return; 
else 
{ 
postorder(root->lchild); 
postorder(root->rchild); 
putchar(root->data); 
} 
} 

int leafcount(bitree root)//计算叶子节点 
{ 
if(!root)return 0; 
else 
{ 
if(!root->lchild&&!root->rchild)return 1; 
else return leafcount(root->lchild)+leafcount(root->rchild); 
} 
} 

int depth(bitree root)//树的高度 
{ 
if(!root)return 0; 
else 
{ 
int m=depth(root->lchild); 
int n=depth(root->rchild); 
return (m>n?m:n)+1; 
} 
} 

void Revolute(bitree root)// 交换左右子树 
{ 
bitree t; 
t=root->lchild; 
root->lchild=root->rchild; 
root->rchild=t; 
if(root->lchild)Revolute(root->lchild); 
if(root->rchild)Revolute(root->rchild); 
} 

void main() 
{ 

bitree root=NULL; 
printf("输入先序序列:\n"); 
root=create(); 

printf("前序遍历:\n"); 
preorder(root); 
printf("\n"); 

printf("中序遍历:\n"); 
inorder(root); 
printf("\n"); 

printf("后序遍历:\n"); 
postorder(root); 
printf("\n"); 

printf("二叉树的叶子结点个数为:%d\n",leafcount(root)); 
printf("二叉树的高度为:%d\n",depth(root)); 

printf("交换左右子树后\n"); 
Revolute(root); 

printf("前序遍历:\n"); 
preorder(root); 
printf("\n"); 

printf("中序遍历:\n"); 
inorder(root); 
printf("\n"); 

printf("后序遍历:\n"); 
postorder(root); 
printf("\n"); 
} 
/*输入序列为前序序列,#代表空 
例如二叉树为 
--------a 
-------/-\ 
------b---c 
-----/-\ 
----d---e 
输入abd##e##c##(每次输入一个字符回车)*/
分享到:
评论
1 楼 无情浪子 2011-09-09  
ask you please
when input the character,how to stop input

相关推荐

    非递归前序,中序,后序遍历二叉树(优化算法).rar_nooneyh_二叉树 非递归_前序 中序 后序_树遍历算法_遍历二叉树

    对于二叉树的非递归遍历算法,除了优化栈空间使用之外,还有助于理解和实现其他数据结构,如线索二叉树,以及在实际问题中的应用,如序列化和反序列化二叉树。这些算法在面试中也经常被问到,是每个程序员应该掌握的...

    前序中序求后序

    总之,“前序中序求后序”是一个经典的二叉树遍历问题,它体现了二叉树遍历的基本原理和递归思想的应用。在C语言环境下,利用递归函数和前序、中序遍历的结果,我们可以有效地重建二叉树并获取后序遍历序列,这对于...

    c语言遍历二叉树包括前序,中序,后序

    以上就是使用C语言进行二叉树遍历的基本方法,无论是前序、中序还是后序,核心都是递归的思想或者借助栈来模拟递归。掌握这三种遍历方式对于理解二叉树的性质和操作至关重要,它们在数据结构和算法的许多实际应用...

    二叉树先序、中序、后序遍历非递归算法

    ### 二叉树先序、中序、后序遍历非递归算法 #### 前言 在计算机科学中,二叉树是一种常见的数据结构,它被广泛应用于各种算法和程序设计中。二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:...

    二叉树的非递归遍历(含前序、中序和后序)

    二叉树的递归遍历算法非常好写。这个.cpp文件里是二叉树的非递归遍历!

    python二叉树遍历、求深度、已知前序中序 求树 求后序 - CSDN博客1

    在给定的代码中,`pre_deep_func` 实现了递归的前序遍历,`mid_deep_func2` 实现了递归的中序遍历,而`after_deep_func2` 是后序遍历的非递归实现。 - **非递归方式**:可以通过模拟调用栈来实现。例如,`pre_deep_...

    二叉树先序遍历、中序遍历和后序遍历非递归算法 C++源码

    用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法

    java二叉树的前序+中序+后序遍历(修改后)

    二叉树的遍历,全部用递归实现,很有规律! 二叉树的遍历,全部用递归实现,很有规律

    C语言实现二叉树的前序、中序、后续遍历(递归法)

    前序遍历是二叉树遍历的一种方式,其顺序为“根节点 -&gt; 左子树 -&gt; 右子树”。这种遍历方式在很多应用场景中都非常有用,例如构建表达式树、查找树中的特定节点等。 **算法实现一:** 1. **定义二叉树结点结构体** ...

    实现先序,中序和后序遍历的二叉树遍历程序

    本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...

    有前序中序求后序遍历

    ### 有前序中序求后序遍历 在数据结构的学习中,二叉树的遍历是非常重要的概念之一。二叉树的遍历方法主要包括三种:前序遍历、中序遍历以及后序遍历。每种遍历方式都有其独特的应用场景,而在实际编程中,有时候...

    二叉树非递归遍历(前序、中序、后序)

    本主题将详细介绍如何非递归地进行二叉树的前序、中序和后序遍历,以及如何使用C语言实现通用栈结构来辅助遍历。 首先,我们来看递归遍历的方法。递归遍历是基于函数调用自身来完成的,对于二叉树,有以下三种遍历...

    二叉树遍历-前序中序后序层次遍历

    本文将深入探讨四种常见的二叉树遍历方法:前序遍历、中序遍历、后序遍历以及层次遍历,并以C++编程语言为例,阐述如何实现这些遍历算法。 1. **前序遍历**(Preorder Traversal) 前序遍历的顺序是根节点 -&gt; 左...

    二叉树创建前序中序后序遍历

    根据给定的文件信息,我们可以总结出以下关于二叉树创建及遍历的相关知识点: ...综上所述,这段代码实现了二叉树的创建与遍历过程,并通过具体的遍历函数将二叉树的信息打印出来,便于理解和分析。

    二叉树的递归遍历,中序遍历,先序遍历,后序遍历

    在本文的示例代码中,我们使用了C语言来实现二叉树的递归遍历。我们首先定义了二叉树结点的结构体,然后实现了创建二叉树、先序遍历、中序遍历和后序遍历的函数。最后,我们使用switch语句来选择不同的遍历方式。 ...

    二叉树的基本操作,包括前序、中序、后序遍历的递归和非递归算法

    本文将深入探讨二叉树的前序、中序、后序遍历的递归和非递归算法。 1. **前序遍历**: - **递归算法**:首先访问根节点,然后递归地对左子树进行前序遍历,最后对右子树进行前序遍历。伪代码如下: ``` function...

    二叉树的前序中序后序遍历代码

    根据给定的文件信息,本文将详细介绍二叉树的基本概念及其前序、中序和后序遍历的实现原理,并对代码进行分析。 ### 一、二叉树基础概念 二叉树是一种特殊的非线性数据结构,它具有以下特点: - 每个节点最多有两...

    java二叉树的前序+中序+后序遍历

    java实现 二叉树的遍历 前序遍历用到递归, 中序和后序遍历用到栈, 其实还是有一定难度的

    关于二叉树前序和后序的非递归遍历算法.rar

    在"关于二叉树前序和后序的非递归遍历算法.pdf"这份文档中,可能详细介绍了这两种遍历方法的实现步骤、伪代码以及可能遇到的问题和解决方案。读者可以通过阅读这份文档深入理解非递归遍历算法,并通过实践来提升自己...

    二叉树的建立和遍历(前序、中序、后序)

    二叉树遍历的效率与树的高度有关,通常为O(n),因为每个节点只被访问一次。在实际应用中,根据具体需求选择合适的遍历方法是非常重要的。例如,前序遍历适合复制整棵树,中序遍历适合打印排序后的元素,而后序遍历则...

Global site tag (gtag.js) - Google Analytics