数据结构之二叉树
有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)
核心算法思想(重要)
先来讲一些知识点:
①结点:包含一个数据元素及若干指向子树分支的信息。
②结点的度:一个结点拥有子树的数目称为结点的度。
③叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。
④分支结点:也称为非终端结点,度不为零的结点称为非终端结点。
⑤树的度:树中所有结点的度的最大值。
⑥结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层。
⑦树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度。
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。
简单的二叉树
完全二叉树
更多知识点看这个,讲的很详细:二叉树基础知识.
算法实现
前序遍历递归算法:
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
PreOrderTraverse(T->lchild); /*再先序遍历左子树*/
PreOrderTraverse(T->rchild); /*最后先序遍历右子树*/
}
中序遍历递归算法:
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild); /*中序遍历左子树*/
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
InOrderTraverse(T->rchild); /*最后中序遍历右子树*/
}
后序遍历递归算法:
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild); /*先后序遍历左子树*/
PostOrderTraverse(T->rchild); /*再后续遍历右子树*/
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
}
实践出真知,代码案例
编写一个程序实现二叉树的各种运算,并完成如下功能:
(1)输出二叉树b;(b为下图所示的二叉树)
(2)输出H节点的左、右孩子节点值;
(3)输出二叉树b的深度;
(4)输出二叉树b的节点个数;
(5)输出二叉树b的叶子节点个数;
(6)释放二叉树b。
案例源码
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data; //数据元素
struct node *lchild; //指向左孩子
struct node *rchild; //指向右孩子
} BTNode;
void CreateBTNode(BTNode *&b, char *str);
void DispBTNode(BTNode *b);
BTNode *FindNode(BTNode *b, ElemType x);
BTNode *LchildNode(BTNode