#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##(每次输入一个字符回车)*/
分享到:
相关推荐
对于二叉树的非递归遍历算法,除了优化栈空间使用之外,还有助于理解和实现其他数据结构,如线索二叉树,以及在实际问题中的应用,如序列化和反序列化二叉树。这些算法在面试中也经常被问到,是每个程序员应该掌握的...
总之,“前序中序求后序”是一个经典的二叉树遍历问题,它体现了二叉树遍历的基本原理和递归思想的应用。在C语言环境下,利用递归函数和前序、中序遍历的结果,我们可以有效地重建二叉树并获取后序遍历序列,这对于...
以上就是使用C语言进行二叉树遍历的基本方法,无论是前序、中序还是后序,核心都是递归的思想或者借助栈来模拟递归。掌握这三种遍历方式对于理解二叉树的性质和操作至关重要,它们在数据结构和算法的许多实际应用...
### 二叉树先序、中序、后序遍历非递归算法 #### 前言 在计算机科学中,二叉树是一种常见的数据结构,它被广泛应用于各种算法和程序设计中。二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:...
二叉树的递归遍历算法非常好写。这个.cpp文件里是二叉树的非递归遍历!
在给定的代码中,`pre_deep_func` 实现了递归的前序遍历,`mid_deep_func2` 实现了递归的中序遍历,而`after_deep_func2` 是后序遍历的非递归实现。 - **非递归方式**:可以通过模拟调用栈来实现。例如,`pre_deep_...
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
二叉树的遍历,全部用递归实现,很有规律! 二叉树的遍历,全部用递归实现,很有规律
前序遍历是二叉树遍历的一种方式,其顺序为“根节点 -> 左子树 -> 右子树”。这种遍历方式在很多应用场景中都非常有用,例如构建表达式树、查找树中的特定节点等。 **算法实现一:** 1. **定义二叉树结点结构体** ...
本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...
### 有前序中序求后序遍历 在数据结构的学习中,二叉树的遍历是非常重要的概念之一。二叉树的遍历方法主要包括三种:前序遍历、中序遍历以及后序遍历。每种遍历方式都有其独特的应用场景,而在实际编程中,有时候...
本主题将详细介绍如何非递归地进行二叉树的前序、中序和后序遍历,以及如何使用C语言实现通用栈结构来辅助遍历。 首先,我们来看递归遍历的方法。递归遍历是基于函数调用自身来完成的,对于二叉树,有以下三种遍历...
本文将深入探讨四种常见的二叉树遍历方法:前序遍历、中序遍历、后序遍历以及层次遍历,并以C++编程语言为例,阐述如何实现这些遍历算法。 1. **前序遍历**(Preorder Traversal) 前序遍历的顺序是根节点 -> 左...
根据给定的文件信息,我们可以总结出以下关于二叉树创建及遍历的相关知识点: ...综上所述,这段代码实现了二叉树的创建与遍历过程,并通过具体的遍历函数将二叉树的信息打印出来,便于理解和分析。
在本文的示例代码中,我们使用了C语言来实现二叉树的递归遍历。我们首先定义了二叉树结点的结构体,然后实现了创建二叉树、先序遍历、中序遍历和后序遍历的函数。最后,我们使用switch语句来选择不同的遍历方式。 ...
本文将深入探讨二叉树的前序、中序、后序遍历的递归和非递归算法。 1. **前序遍历**: - **递归算法**:首先访问根节点,然后递归地对左子树进行前序遍历,最后对右子树进行前序遍历。伪代码如下: ``` function...
根据给定的文件信息,本文将详细介绍二叉树的基本概念及其前序、中序和后序遍历的实现原理,并对代码进行分析。 ### 一、二叉树基础概念 二叉树是一种特殊的非线性数据结构,它具有以下特点: - 每个节点最多有两...
java实现 二叉树的遍历 前序遍历用到递归, 中序和后序遍历用到栈, 其实还是有一定难度的
在"关于二叉树前序和后序的非递归遍历算法.pdf"这份文档中,可能详细介绍了这两种遍历方法的实现步骤、伪代码以及可能遇到的问题和解决方案。读者可以通过阅读这份文档深入理解非递归遍历算法,并通过实践来提升自己...
二叉树遍历的效率与树的高度有关,通常为O(n),因为每个节点只被访问一次。在实际应用中,根据具体需求选择合适的遍历方法是非常重要的。例如,前序遍历适合复制整棵树,中序遍历适合打印排序后的元素,而后序遍历则...