二叉树及其基本操作(一)(C语言递归实现前中后层序遍历)

树的概念:
由N(N>=0)个节点构成的集合,对于N>1的树,有:

1、有一个特殊的节点,称为根节点,根节点没有前驱节点
2、除根节点外其余节点被分成M(M>0)个互不相交的集合T1,T2……Tm,其中每一个集合Ti(1<=i<=m)
是一棵结构与树类似的子树,每棵子树的根节点有且只有一个前驱,可以有0个或多个后继

因此,树是递归定义的。

树的存储结构:

1、双亲表示法:用指针表示出每个节点的双亲节点
typedef int DataType;
typedef struct TreeNode{
    struct TreeNode *parent;
    DataType data;
}TreeNode;
优点:寻找一个节点的双亲节点很方便
缺点:寻找一个节点的孩子节点不方便
2、孩子表示法:用指针指出每个节点的孩子节点
//以二叉树为例
typedef int DataType;
typedef struct TreeNode{
    struct TreeNode *lchild;
    struct TreeNode *rchild;
    DataType data;
}TreeNode;
优点:寻找一个节点的孩子节点很方便
缺点:寻找一个节点的双亲节点不方便
3、双亲孩子表示法:用指针表示出每个节点的双亲节点,也表示
出 每个节点的孩子节点,也就是双亲表示法加上孩子表示法
typedef int DataType;
typedef struct TreeNode{
    struct TreeNode *parent;
    struct TreeNode *lchild;
    struct TreeNode *rchild;
    DataType data;
}TreeNode;
优点:找某个节点的双亲节点和孩子节点都很方便
4、孩子兄弟表示法:表示出每个节点的第一个孩子节点也表示出
每个节点的下一个兄弟节点
typedef int DataType;
typedef struct TreeNode{
    struct TreeNode *parent;
    struct TreeNode *NextBrother;
    DataType data;
}TreeNode;

二叉树:一棵二叉树是节点的一个有限集合,该集合或者为空,或者是由一个根节点加上两课分别称为左子树和右子树的二叉树组成

二叉树的特点:
1、每个节点最多有两棵子树,即二叉树不存在度大于2的节点
2、二叉树的子树有左右之分,其子树的次序不能颠倒

因此,二叉树是通过下面5种形式的组合或嵌套而形成:
这里写图片描述
二叉树的基本操作

二叉树的遍历:
遵循某种次序,遍历二叉树中的所有节点,使的每个节点都被访问到(不重),而且仅访问一次(不漏)。“访问”,即对节点实行某种操作。
若规定VLR分别代表:遍历根节点,遍历根节点的左子树,遍历根节点的右子树,则有:
前序:VLR
中序:LVR
后序:LRV

下面以代码实现二叉树的遍历:(以孩子表示法为例)

//bin_tree.h文件内容
#pragma once

typedef char TreeDataType;

typedef struct TreeNode
{
    TreeDataType data;
    struct TreeNode *lchild;
    struct TreeNode *rchild;
}TreeNode;

//二叉树的初始化函数
void TreeInit(TreeNode **tRoot);
//二叉树的先序遍历函数
void TreePreOrder(TreeNode *root);
//二叉树的中序遍历函数
void TreeInOrder(TreeNode *root);
//二叉树的后序遍历函数
void TreePostOrder(TreeNode *root);
//二叉树的层序遍历函数
void TreeLevelOrder(TreeNode *root);
//二叉树的拷贝
TreeNode *TreeClone(TreeNode *root);
//用数组中的元素内容创建一个二叉树(该数组满足数的前序遍历且包含空节点)
TreeNode *CreateTree(TreeDataType arr[],int size,int *index,TreeDataType null_node);
//二叉树的销毁
void TreeDestroy(TreeNode **tRoot);
//bin_tree.c文件内容:
#include<stdio.h>
#include<stdlib.h>
#include"bin_tree.h"
#include"queue.h"

#define Test_Header printf("\n==========%s=========\n",__FUNCTION__);

//创建新节点的函数
TreeNode *CreateNode(Tree
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值