数据结构 树 二叉树的建立及遍历 C语言版

本文介绍了如何使用C语言创建二叉树并实现先序、中序、后序遍历。通过输入以特定格式表示的二叉树数据,程序将构建二叉树并输出其遍历结果,同时统计并显示树中叶子节点的数量。
//二叉树的建立以及先序、中序、后序遍历算法 以及统计二叉树的叶子结点数目算法
#include <stdio.h>
#include <stdlib.h>
typedef char DataType;
typedef struct Node
{
	DataType data;
	struct Node *LChild;
	struct Node *RChild;
} BiTNode,*BiTree;   //定义二叉树

void CreateBiTree(BiTree *bt)  //用先序遍历创建二叉树
{
	char ch;
	ch=getchar();
	if(ch=='.') (*bt)=NULL;
	else
	{
		*bt=(BiTree)malloc(sizeof(BiTNode));
		(*bt)->data=ch;
		CreateBiTree(&((*bt)->LChild));
		CreateBiTree(&((*bt)->RChild));
	}
}

void PreOrder(BiTree root) //先序遍历二叉树
{
	if(root!=NULL)
	{
		printf("%c",root->data);
		PreOrder(root->LChild);
		PreOrder(root->RChild);
	}

}

void InOrder(BiTree root)  //中序遍历二叉树
{
	if(root!=NULL)
	{
		InOrder(root->LChild);
		printf("%c",root->data);
		InOrder(root->RChild);
	}
}

void PostOrder(BiTree root) //后序遍历二叉树
{
	if(root!=NULL)
	{
		PostOrder(root->LChild);
		PostOrder(root->RChild);
		printf("%c",root->data);
	}
}

int LeafCount=0;
void leaf(BiTr
### 数据结构课程设计 C言 实现 二叉树 前序 中序 后序 层次 遍历 #### 定义二叉树结点结构体 为了实现二叉树的各种遍历方法,首先定义一个表示二叉树节点的结构体。 ```c typedef struct TreeNode { char data; struct TreeNode *left, *right; } TreeNode; ``` #### 创建新节点函数 创建一个新的二叉树节点用于构建具体的二叉树实例。 ```c TreeNode* createNode(char value) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->data = value; newNode->left = NULL; newNode->right = NULL; return newNode; } ``` #### 构建测试用例中的二叉树 基于给定的例子来建立一棵简单的二叉树以便于展示不同类型的遍历算法效果。 ```c TreeNode* buildSampleTree() { /* Construct the following tree: H / \ B Z / \ \ D U A / A */ TreeNode* root = createNode('H'); root->left = createNode('B'); root->right = createNode('Z'); root->left->left = createNode('D'); root->left->right = createNode('U'); root->left->left->left = createNode('A'); root->right->right = createNode('A'); return root; } ``` #### 前序遍历(先访问根节点) 按照访问顺序为:根 -> 左子 -> 右子的方式打印各节点字符[^1]。 ```c void preorderTraversal(TreeNode* node) { if (!node) return; printf("%c ", node->data); // 访问当前节点 preorderTraversal(node->left); // 进入左子继续前序遍历 preorderTraversal(node->right); // 进入右子继续前序遍历 } ``` #### 中序遍历(先访问左子再访问根最后访问右子) 遵循左子 -> 根 -> 右子这样的路径依次输出各个顶点上的字母。 ```c void inorderTraversal(TreeNode* node) { if (!node) return; inorderTraversal(node->left); printf("%c ", node->data); inorderTraversal(node->right); } ``` #### 后序遍历(最后才处理根节点的信息) 采取的是先走到底部最左边的孩子开始逐级向上回溯并记录经过的所有节点直到遇到分支转向右边重复相同过程直至整棵被完全探索完毕之后才会回到最初的起点即根的位置进行最终的操作。 ```c void postorderTraversal(TreeNode* node) { if (!node) return; postorderTraversal(node->left); postorderTraversal(node->right); printf("%c ", node->data); } ``` #### 层次遍历(广度优先搜索) 层次遍历是从上到下按层读取每一行的内容。这里采用队列辅助完成这一操作[^3]。 ```c #include <queue> void levelOrderTraversal(TreeNode* root){ std::queue<TreeNode*> q; if(root != nullptr) q.push(root); while(!q.empty()){ TreeNode* current = q.front(); q.pop(); printf("%c ",current->data); if(current->left!=nullptr) q.push(current->left); if(current->right!=nullptr) q.push(current->right); } } ``` 以上就是完整的C语言版本对于二叉树四种基本遍历模式的具体编码实践案例说明。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值