标签:
没有天生的信心,只有不断培养的信心。
/**
*@author StormMaybin
@Date 2016-07-17
*/
上上一篇文章总结了一下线性表,今天就来总结一下数据结构中非线性部分,非线性数据结构包括树图以及网!今天我们先来看看二叉树!二叉树是一种特殊的树结构。在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树是很重要的数据结构,要想搞清楚二叉树,先要对基本概念了解透彻。
说完了基本概念,现在就来看看二叉树都有什么性质。
这个没什么可解释的,第二层是2个,第三层是4个,第四层是8个······以此类推。
由性质1可知,因为第i层的结点数为,依次累加可得到这个性质!
假设一个二叉树总结点个数为n,度为i的结点个数为ni,又因为二叉树的度小于等于2,那么得出关系式:n = n0 + n1 + n2;分支数B = n +1;B = 2n2 + n1;联合三个式子得出n = n0 + n1 + n2;
设二叉树的结点数为n,因为由性质3可知,深度为h的结点数最多是,那么可以得到不等式:2^(h-1)-1 < n <= 2^(h)-1 —->2^(h-1) <= n+1 < 2^h;两边取对数可得:h-1 <= log2(n+1) < h;所以得证!
对于这三个性质,很简单,因为结点数i的左孩子是2i,那么右孩子就是2i+1;显然上述性质得证!
接下来,我们就用代码来实现二叉树!
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建一颗二叉树
/**
*对于先序中序和后序,其实就是以root结点为先后顺序划分的
*如果,先开始输入的是root,那么就是先序,如果先开始输入左子树,然后是root,那么就是中序,后序就是root结点在最后输入!遍历也是如此!
*/
void Create(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch==‘#‘)
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
//递归形式创建二叉树
Create(T->lchild);
Create(T->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);
}
}
这里的遍历过程有三种形式可选,先序中序和后序,区别无非就是递归调用时候的顺序不同,递归形式的遍历逻辑上很清晰!
void Preorderleaf(BiTree &root)
{
if(root!=NULL)
{
if(root->lchild==NULL&&root->rchild==NULL)
printf("%c ",root->data);
Preorderleaf(root->lchild);
Preorderleaf(root->rchild);
}
}
int LeafCount(BiTree &root)
{
int leaf;
if(root==NULL)
leaf=0;
else if(root->lchild==NULL&&root->rchild==NULL)
leaf=1;
else
leaf=LeafCount(root->lchild)+LeafCount(root->rchild);
return leaf;
}
int Max (int x, int y)
{
return x > y ? x : y;
}
int PostTreeDepth(BiTree &root)
{
int hl,hr,max;
if(root!=NULL)
{
hl=PostTreeDepth(root->lchild);
hr=PostTreeDepth(root->rchild);
max=Max(hl,hr);
return max+1;
}
else
return 0;
}
void BinTreeSt()
{
BiTree bt;
Create(bt);
Preorder(bt);
printf("\n");
Inorder(bt);
printf("\n");
Postorder(bt);
printf("\n");
printf("叶子节点:");
Preorderleaf(bt);
printf("\n");
printf("叶子节点的个数为:%d\n",LeafCount(bt));
printf("树的深度为:%d\n",PostTreeDepth(bt));
}
int main()
{
dowork();
return 0;
}
运行结果:
标签:
原文地址:http://blog.csdn.net/strommaybin/article/details/51935080