树的简单c语言实现(先中后序遍历)

#include<stdio.h>

#include<stdlib.h>

#define depth 5

typedef int Status;

typedef char TElemtype;

typedef struct BiTNode{

TElemtype data;

struct BiTNode *lchild,*rchild;

}*BiTree;

Status printElement(TElemtype e){

printf("%c",e);

return 1;

}

Status InitBTree(BiTree &T)

{

T = NULL;

return 1;

}

char* CreatBiTree(BiTree &T,char *s){

if((*s)==‘ ‘){

T=NULL;

return s+1;

}

else{

T=(BiTNode * )malloc(sizeof(BiTNode));

if(!T) return 0;

T->data=(*s);

CreatBiTree(T->rchild,CreatBiTree(T->lchild,s+1));

}

}

//先序遍历

Status PreOrderTraverse(BiTree T,Status(* Visit)(TElemtype e)){

if(T){

Visit(T->data);

PreOrderTraverse(T->lchild,Visit);

PreOrderTraverse(T->rchild,Visit);

}

return 1;

}

//后序

Status PostOrderTraverse(BiTree T,Status(* Visit)(TElemtype e)){

if(T){

PostOrderTraverse(T->lchild,Visit);

PostOrderTraverse(T->rchild,Visit);

Visit(T->data);

}

return 1;

}

//中序

Status InOrderTraverse(BiTree T,Status(* Visit)(TElemtype e)){

if(T){

InOrderTraverse(T->lchild,Visit);

Visit(T->data);

InOrderTraverse(T->rchild,Visit);

}

return 1;

}

int main(){

BiTree t;

char a[100]={"ABC  DE G  F   "};

InitBTree(t);

CreatBiTree(t,a);

PreOrderTraverse(t,printElement);

printf("\n");

PostOrderTraverse(t,printElement);

printf("\n");

InOrderTraverse(t,printElement);

printf("\n");

return 0;

}

时间: 2024-10-08 15:52:21

树的简单c语言实现(先中后序遍历)的相关文章

002.深入浅出理解[二叉树的构建、先中后序遍历、树的深度、左右子树互换]

二叉树本来就是递归定义的,如果对递归还不是特别了解,建议看一下<001.深入浅出解释[递归]> 写一个递归函数很简单,只需要记住下面2点: 1.递归中止条件:对于二叉树来说一般是node==null的时候判断到了叶子结点 2.递归函数::描述一个中间过程,然后用代码实现,调用自身的时候传递的参数就是你想要递归的方式. 下面的代码就是一个二叉树的创建.先中后序遍历.树的深度.左右子树的互换的过程 #include <stdio.h> // 定义二叉树的结点 struct treeNo

二叉树的前中后序遍历简单的递归

二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况  这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出 二叉树节点数据结构: struct Binary_node{    int val;    Binary_node *left;    Binary_node *right;    Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

二叉树非递归先中后序遍历 及 非递归交换二叉树两个孩子的位置

看到一个非递归交换一个二叉树的左右孩子的位置,于是想实现之,才发现非递归的先中后序遍历都忘记了……于是杂七杂八的写了一些,抄抄资料就实现了,然后实现非递归交换两个孩子的位置还是相当容易的.先直接上代码吧,其实这东西还是得自己写写过一遍的,印象才会更加深刻: #include <iostream> #include <fstream> #include <string> #include <stack> using std::cout; using std::

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

栈实现二叉树先,中,后序遍历 如果是使用递归来实现二叉树的先,中,后序遍历只需要更改三行代码的位置,但若是使用栈来写那便会有趣得多 根结点与其左右子树间的输出优先级 graph TD 1((根结点))---2((左子树)) 1---3((右子树)) 遍历方式 输出优先级 先序 根结点>左子树>右子树 中序 左子树>根结点>右子树 后序 左子树>右子树>根节点 使用栈的规则 栈内元素是指向结点的指针 只有栈顶元素指向的结点内容才会被输出 方便,不用记忆太多结点 结点内容输

树的前中后序遍历和层次遍历

遍历规则 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历:左子树---> 根结点 ---> 右子树 后序遍历:左子树 ---> 右子树 ---> 根结点 层次遍历:只需按层次遍历即可 注: 1.前序.中序.后序属于深度优先遍历(使用递归较为方便),层次遍历为广度优先遍历(一般实现需要借助其他数据结构的支撑,如下面的队列等). 2.中序遍历有个小技巧:对于给定的树,可以画垂线,从左到右即为中序遍历的次序. 代码实现 #include <iostrea

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实

二叉树的前中后序遍历迭代&amp;广度遍历

递归很是简单 但也应该掌握其迭代方式的遍历方法 这三种的迭代遍历方法需要通过栈来存储节点 尤其是后序遍历还需要 记录当前节点的右子树是否已被遍历 决定是否遍历当前节点 而其广度遍历 只需要一个队列来顺序记录遍历节点 即可轻松解决问题  主要思想在程序代码中来做说明 前序遍历:遍历结果返回一个vector容器中 std::vector<int> BinaryTree::pre_order_iter(Binary_node *root){    std::vector<int> res

数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为0 1 2 的结点个数】

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<malloc.h> #define null 0 using namespace std; typedef struct node { int data;//节点 node *lchild,*rchild; }node,*Tree; typedef struct{ Tree to

二叉树系列 - 二叉树的前/中/后序遍历(非递归)

二叉树的遍历是二叉树中最最基础的部分. 这里整理二叉树不用递归实现三种顺序遍历的方式. 不用递归的话,一般需要栈来完成.当然线索二叉树(不需要栈或递归)也可以完成中序遍历,这种方式在这篇文章中已经讨论过.这里着重讨论使用栈的实现方式. 中序遍历 (1) 双while,第二个内层while是为了不断压入left child. vector<int> inorderTraversal(TreeNode *root) { vector<int> v; if(!root) return v