链式二叉树

该博客主要介绍了如何使用C语言创建和遍历二叉树。通过先序、中序和后序遍历的方式展示了递归在二叉树操作中的应用。代码中定义了二叉树节点结构,实现了递归建树和三种遍历方法,为理解数据结构和递归提供了实例。
#include <stdio.h>
#include <stdlib.h>
#define M 255
typedef struct node{
	char data;
	struct node *lchild,*rchild;
}TreeNode,*BiTree;
BiTree T;
void visit(BiTree t){
	printf("%c ",t->data);
}
void CreatTree(BiTree &T){         //利用先序遍历的递归建树 
	char c;
	scanf("%c",&c);
	if(c!='#'){
		T=(TreeNode *)malloc(sizeof(TreeNode));
		T->data=c;
		T->lchild=T->rchild=NULL;
		CreatTree(T->lchild);
		CreatTree(T->rchild);
	}

}  
void PreOrder(BiTree t){         //递归先序遍历 
	if(t!=NULL){
		visit(t);
		PreOrder(t->lchild);
		PreOrder(t->rchild);
	}
}
void InOrder(BiTree t){       //递归中序遍历 
	if(t!=NULL){
		InOrder(t->lchild);
		visit(t);
		InOrder(t->rchild);
	}
}
void PostOrder(BiTree t){      //递归后序遍历 
	if(t!=NULL){
		PostOrder(t->lchild);
		PostOrder(t->rchild);
		visit(t);
	}
}

int main(){
	//test();
	CreatTree(T);
	printf("先序遍历:");
	PreOrder(T);
	printf("\n中序遍历:");
	InOrder(T);
	printf("\n后序遍历:");
	PostOrder(T);
	return 0;
}
### 链式二叉树的数据结构 链式二叉树是一种常见的二叉树存储形式,尤其适用于非完全二叉树的情况。在这种结构中,每个节点由三部分组成:数据域用于保存节点的实际数据;两个指针域分别指向该节点的左子节点和右子节点[^1]。 以下是典型的链式二叉树节点定义: ```c typedef struct TreeNode { int data; // 数据域 struct TreeNode* left; // 左孩子指针 struct TreeNode* right; // 右孩子指针 } TreeNode; ``` 这种设计使得链式二叉树能够灵活表示任意形状的二叉树,而不会像顺序存储那样浪费空间。 --- ### 链式二叉树的实现方式 链式二叉树的操作主要依赖递归思想完成。相比顺序存储结构,虽然编写起来更直观,但由于涉及递归调用,初学者可能会觉得复杂[^2]。下面列举几个基本操作及其具体实现方法: #### 创建新节点 创建一个新的二叉树节点是一个基础功能,通过分配内存并初始化其字段来完成。 ```c TreeNode* createNode(int value) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); if (!newNode) return NULL; // 内存不足返回NULL newNode->data = value; newNode->left = newNode->right = NULL; return newNode; } ``` 此函数负责动态分配一块新的 `TreeNode` 类型内存区域,并将其初始化为指定值以及设置左右孩子的初始状态为空[^3]。 #### 插入节点 对于简单的二叉查找树来说,可以根据数值大小决定插入位置。 ```c void insertNode(TreeNode** root, int value) { if (*root == NULL) { *root = createNode(value); } else { if (value < (*root)->data) { insertNode(&((*root)->left), value); // 小于当前节点则进入左子树 } else { insertNode(&((*root)->right), value); // 大于等于则进入右子树 } } } ``` 上述代码展示了如何利用递归来构建一棵基于比较运算符形成的二叉搜索树(BST)。 #### 前序遍历 前序遍历按照访问根节点 -> 访问左子树 -> 访问右子树 的顺序执行。 ```c void preOrderTraversal(TreeNode* node) { if (node != NULL) { printf("%d ", node->data); // 输出当前节点数据 preOrderTraversal(node->left); // 进行左子树先序遍历 preOrderTraversal(node->right); // 进行右子树先序遍历 } } ``` 这段程序体现了递归算法的核心应用之一——处理具有层次关系的对象集合。 --- ### 总结 链式二叉树因其灵活性成为实际开发中最常用的二叉树表现形式之一。掌握它的核心概念不仅有助于理解其他高级数据结构,还能有效提升个人解决问题的能力特别是关于递归方面的技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值