树的一些概念:(有些博客是错的,故此记一下)
树中节点
n的高:n到一片树叶最长路径的长,树高等于根高,叶子高为0;
n的深度:从根到n的唯一路径的长,根深度为0,树深等于最深的叶子的深度
深度等于树高(数值上),注意区分,二者不等同;
二叉树性质:
1、非空二叉树的第n层上至多有2^(n-1)个元素。(n从1开始)
2、深度为h的二叉树至多有2^(h+1)-1个结点。
二叉树:
每个节点都不能有多于两个的儿子;
满二叉树:
一颗深度为k且有2^(k+1)-1个结点的二叉树称为满二叉树(回顾二叉树的性质,每个位置都填满了,这就是满的意思)。
除叶子结点外的所有结点均有两个子结点。节点数达到最大值。所有叶子结点必须在同一层上。
完全二叉树:
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(深度k-1的节点要不无叶子节点,要不至少含有左叶子节点)
存储结构
顺序存储:保存在数组中,数组的每一个元素是一个结构体,指明了元素值,左右子节点的位置(在数组中的下标),这种方法据说占空间,我觉得主要是难扩展,比较非主流
链式存储:保存在类似链表的结构中,每个节点也是一个结构体,指明了元素,左右子节点的指针;
递归实现二叉树的遍历:
示例代码:
#include
using namespace std;
typedef struct node{
char inode;
node *left;
node *right;
}NODE ,*PNODE;
void preout(PNODE tr)//前序
{
if(tr!=NULL)
{
cout<
inode<<" ";
preout(tr->left);
preout(tr->right);
}
}
void midout(PNODE tr)//中序
{
if(tr!=NULL)
{
midout(tr->left);
cout<
inode<<" ";
midout(tr->right);
}
}
void finout(PNODE tr)//后序
{
if(tr!=NULL)
{
finout(tr->left);
finout(tr->right);
cout<
inode<<" ";
}
}
PNODE creatree(PNODE *tr)
{
//cout<<
>c; if(c=='%') *tr=NULL; else { *tr=new NODE; (*tr)->inode=c; creatree(&(*tr)->left); creatree(&(*tr)->right); } //cout<
<
inode << endl; return 0; }
结果:第一行为输入利用前序遍历生成树,其余为前,中,后序输出
无叶子节点输入'%'