C语言二叉树的遍历示例介绍

 更新时间:2022年01月07日 16:35:58   作者:不吃香菜的香菜头子  
大家好,本篇文章主要讲的是C语言二叉树的遍历示例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

     在本算法中先利用先序遍历创建了树,利用了递归的算法使得算法简单,操作容易,本来无printf("%c的左/右子树:", ch);的语句,但由于计算机需要输入空格字符来判断左右子树,为了减少人为输入的失误,特地加入这条语句,以此保证准确率。

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 3
 
typedef int Status;  
typedef int Boolean; 
typedef char TElemType;
 
typedef struct BiTNode{
	TElemType	   data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
 
//创建二叉树函数
 
Status CreateBiTree(BiTree &T){
	TElemType ch;
	scanf("%c", &ch);
	getchar();
	if(ch == ' '){	T = NULL;}
	else {
		if( !(T=(BiTree)malloc(sizeof(BiTNode))))(exit(OVERFLOW));
		T->data = ch;				
		printf("%c的左子树:", ch);
		CreateBiTree(T->lchild);		
		printf("%c的右子树:", ch);
		CreateBiTree(T->rchild);	}
	return OK;
}
 
//先序遍历函数
Status PreOrderTraverse(BiTree T, Status (* Visit)(TElemType e)){
	if(T){
		if(Visit(T->data)){
			if(PreOrderTraverse(T->lchild, Visit)){
				if(PreOrderTraverse(T->rchild, Visit)){
					return OK;
               }	
            }	
         }
		return ERROR;
    }
	else {return OK;}
}
 
//中序遍历函数
Status InOrderTraverse(BiTree T, Status (* Visit)(TElemType e)){
	if(T){
		if(PreOrderTraverse(T->lchild, Visit) ){
			if(Visit(T->data)){
				if(PreOrderTraverse(T->rchild, Visit) ){
					return OK;
           }
	   }	
   }
		return ERROR;
        }
	else {
		return OK;
        }
	}
 
//后序遍历函数
Status PosOrderTraverse(BiTree T, Status (* Visit)(TElemType e)){
	if(T){
		if(PreOrderTraverse(T->lchild, Visit) ){
			if(PreOrderTraverse(T->rchild, Visit) ){
				if(Visit(T->data)){return OK;
}
	}	
}
		return ERROR;}
	else {return OK;
}
}
 
 
//输出二叉树函数
Status PrintElement(TElemType e){	
	printf("%c",e);
	return OK;
}
 
//主函数
int main(){
	BiTree T;
	printf("输入根结点:");
	CreateBiTree(T);
	printf("先序遍历:\n");
	PreOrderTraverse(T, PrintElement);
	printf("\n");
	printf("中序遍历:\n");
	InOrderTraverse(T, PrintElement);
	printf("\n");
	printf("后序遍历:\n");
	PosOrderTraverse(T, PrintElement);
	return 0;
}

       遍历操作有四种,其不同在于对根结点的访问顺序不同。在先序遍历中,首先访问根结点,然后递归地做左子树的先序遍历,然后是右子树的递归先序遍历。 在中序遍历中,递归地对左子树进行中序遍历,访问根结点,最后递归中序遍历右子树。在后序遍历中,递归地对左子树和右子树进行后序遍历,然后访问根结点。先序,中序,后序遍历就是对于根节点的访问顺序。

       但无论哪种遍历方式,递归的方法是最简便,最直接,最简单的算法。

      运行截图:

到此这篇关于C语言二叉树的遍历示例介绍的文章就介绍到这了,更多相关C语言二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt编写提示进度条的实现示例

    Qt编写提示进度条的实现示例

    进度条在很地方都可以使用到,Qt自带的进度条或者操作系统的进度条样式,不够炫,本文就介绍一下Qt编写自定义控件的提示进度条的实现示例,感兴趣的可以了解一下
    2021-12-12
  • C++函数模板学习示例教程指南

    C++函数模板学习示例教程指南

    这篇文章主要为大家介绍了C++函数模板学习示例教程指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • QT使用SQLite数据库超详细教程(增删改查、对大量数据快速存储和更新)

    QT使用SQLite数据库超详细教程(增删改查、对大量数据快速存储和更新)

    这篇文章主要给大家介绍了关于QT使用SQLite数据库的相关资料,其中包括增删改查以及对大量数据快速存储和更新,SQLite是一种嵌入式关系型数据库管理系统,它是一个软件库,提供了一个自包含、无服务器、零配置的、事务性的SQL数据库引擎,需要的朋友可以参考下
    2024-01-01
  • C++ operator关键字(重载操作符)的用法详解

    C++ operator关键字(重载操作符)的用法详解

    下面小编就为大家带来一篇C++ operator关键字(重载操作符)的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C语言之从字符数组中删除特定的字符

    C语言之从字符数组中删除特定的字符

    本篇文章主要介绍了从字符数组中删除特定字符的实现方法,有需要的朋友可以参考下
    2015-07-07
  • MFC对话框实现梯形分页

    MFC对话框实现梯形分页

    这篇文章主要为大家详细介绍了MFC对话框实现梯形分页,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C++ OpenCV实现图像修复功能

    C++ OpenCV实现图像修复功能

    这篇文章主要介绍了通过C++ OpenCV中提供的inpaint API实现对有瑕疵的图像进行修复,文中的方法讲解详细,感兴趣的同学可以跟随小编一起学习一下
    2022-01-01
  • C++类中变量也可以是引用的代码实例

    C++类中变量也可以是引用的代码实例

    今天小编就为大家分享一篇关于C++类中变量也可以是引用的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • MFC中exe图标修改的方法

    MFC中exe图标修改的方法

    修改窗口标题图标可通过导入图标,然后在CMainFrame.:OnCreate函数中加载图标即可, 代码如下:
    2013-04-04
  • C++中的数组你真的理解了吗

    C++中的数组你真的理解了吗

    这篇文章主要为大家详细介绍了C++的数组,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02

最新评论