二叉树学习

一.树

树是一种递归定义的数据结构,是一种重要非线性的数据结构。它是由n(n>=1)个有限节点组成一个具有层次结构的集合。

二.树的相关术语

节点的度:一个节点含有的子树的个数称为该节点的度。

叶节点或终端节点:度为0的节点称为叶节点。

非终端节点或分支节点:度不为0的节点

兄弟节点:具有相同父节点的节点。

树的度:一棵树中,最大的节点的度称树的度。

节点的 层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推

树的高度或深度:树种节点的最大层次。

子孙:以某节点为根的子树种任一节点都称为该节点的子孙

三。种类

无序树:树中任意节点的子节点之间没有顺序关系,称为无序树,也成为自由树

有序树:树种任意节点的子节点时间有顺序关系,这种树称为有序树

二叉树:每个节点最多含有两个子树的树称为二叉树

完全二叉树:除了叶子节点,每个节点可以有左右子树或者左子树。

满二叉树:除了叶子节点外,每个节点都有两个结点

四。二叉树的存储结构

1.顺序

2.链式

这两种结构相比较而言。顺序结构数据的地址是连续的,便于查找数据。而链式结构数据不一定是连续的,便于数据的插入、删除操作。

五。二叉树数据结构的创建

typedef char datatype;

typedef  struct _BiTNode

{

datatype data;

struct  _BiTNode*leftChild;

struct _BiTNode *rightChild; 

}BiTNode,*pBiTree;

//创建一颗二叉树

void Create(BiTNode &T)

{

char ch;

scanf("%c",&ch);

if(ch=='#')

T==NULL;

else

{

T=(BiTNode *)malloc(sizeof(BiTNode));

T->data=ch;

Create(T->leftChild);

Create(T->rightChild);

}

}

//先序遍历打印二叉树

void PreOrder(BiTNode &root)

{

if(root!=NULL)

{

printf("%c ",root->data);

PreOrder(root->leftChild);

PreOrder(root->rightChild);

}

}

//中序遍历打印二叉树

void InOrder(BiTNode &root)

{

if(root!=NULL)

{

InOrder(root->leftChild);

printf("%c ",root->data);

InOrder(root->rightChild);

}

}

//后序遍历打印二叉树

void PostOrder(BiTNode &root)

{

if(root!=NULL)

{

PostOrder(root->rightChild);

PostOrder(root->leftChild);

printf("%c ",root->data);

}

}

//先序遍历输出叶子节点

void PreOrderLeaf(BiTNode &root)

{

if(root!=NULL)

{

if(root->leftChild==NULL && root->rightChild==NULL)

{

printf("%c ",root->data);

PreOrderLeaf(root->leftChild);

PreOrderLeaf(root->rightChild);

}

}

}

//中序遍历输出叶子节点

void InOrderLeaf(BiTNode &root)

{

if(root!=NULL)

{

if(root->leftChild==NULL && root->rightChild)

{

InOrderLeaf(root->leftChild);

printf("%c ",root->data);

InOrderLeaf(root->rightChild);

}

}

}

//后序遍历输出叶子节点

void PostOrderLeaf(BiTNode &root)

{

if(root!=NULL)

{

if(root->leftChild && root->rightChild)

{

PostOrderLeaf(root->leftChild);

PostOrderLeaf(root->rightChild)

printf("%c ",root->data);

}

}

}

//统计叶子节点个数

int LeafCount(BiTNode &root)

{

int leaf;

if(root==NULL)

leaf=0;

else if(root->leftChild==NULL && root->rightChild==NULL)

{

leaf=1;

}

else

{

leaf=LeafCount(root->leftChild)+LeafCount(root->rightChild);

}

return leaf;

}

//统计树的高度

int PostTreeDepth(BiTNode &root)

{

int hl,hr,max;

if(root!=NULL)

{

hl=PostTreeDepth(root->leftChild);

hr=PostTreeDepth(root->rightChild);

max=((hl>hr)?hl:hr);

return max+1;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值