c++中二叉树的实现

一:树的定义:
树:T={D,R}。D是包含n个节点的有穷集合(n≥0)。
当n=0时为空树,否则关系R满足以下条件:       
有且仅有一个节点d0∈D,它对于关系R来说没有前驱节点,节点d0称作树的根节点。
  除节点d0外,D中的每个节点对于关系R来说都有且仅有一个前驱节点。
  D中每个节点对于关系R来说可以有零个或多个后继节点。


二:树的表示:
1.树形表示法
2.文氏图表示法
3.凹入表示法
4.括号表示法
三:树的一点基本概念
  节点的度: 对于这个节点,他有多少出度,就是多少度(不考虑入度) 
  树的度: 这棵树节点的度最大的数值就是树的度
  节点的名称: 没有入度的节点称为根节点。没有出度的节点称为叶节点,两者皆有称为分支节点
  路径和路径长度:从根节点到目标节点走过的节点连线就是路径,路径长度等于路径的节点减一
  节点称谓: 同一颗树上,节点的前驱成为父亲节点,后继称为孩子节点,同一层次的称为兄弟节点
  节点的层次: 从根节点出发,每经历一次孩子节点,层数加一。最大层次称为树的高度


四:多棵树没有相连称为 森林




五:设:边数为:e 节点数为:n
度的和=分支数,分支数=n-1,所以,n=度之和+1
    求解树的节点个数问题:对于度为m的树,在n、n0、n1、n2、…、nm中只有两个参数未知时,一般可求出这两个值。例如求n和n0的求解过程如下:
n=n0+n1+n2+.....+nm
度之和=n+1
度之和=n0*0+n1*1+n2*2+.....+nm*m
n=n1+2n2+....+mnm+1=n0+n1+....+nm
即:n0=n2+.....(m-1)nm+1


六:
   度为m的树第 i 层最多有m^(i-1)个节点,i>0
   高度为 h 的 m 次树最多有((m^h)-1)/(m-1)个节点,h>=0
   具有n个节点的m次树的最少高度为:[log_m(n(m-1)+1)]
[((m^(h-1))-1)/(m-1)]
using namespace std;


typedef char Elm;
#define Max 10000 
//树结构 
struct node
{
Elm data;//数据域 
node* left;//左孩子指针 
node* right;//右孩子指针 
} ;


static int number=0;//全局数据,标志数组数据 
Elm A[Max]={'0'}
//先序创树用 # 代表空 
void createtree(node* &head,Elm *A)
{
char c=A[number]; 
if(c=="#") 
{
head=NULL;
return ;
    }
head=new node;
head->data=c;
number++;
create(head->left,A);
create(head->right,A);
} 


//前序遍历
void visit1(node* head)
{
if(head) cout<data<<" ";
if(head->left)visit1(head->left);
if(head->right)visit1(head->right);
return ;
} 
//中序遍历
void visit2(node* head)
{
if(head->left)visit2(head->left);
if(head) cout<data<<" ";
if(head->right)visit2(head->right);
return ;
}
//后序遍历 
void visit3(node* head)
{
if(head->left)visit3(head->left);
if(head->right)visit3(head->right);
if(head) cout<data<<" ";
return ;
} 

二叉树的性质

1.非空二叉树上叶节点数等于双分支节点数加1。
即:n0=n2+1,n1+2n2=n0+n1+n2-1
2.二叉树的高度: h=[log_2n]+1或h=log_2(n+1)


3.满二叉树是最严格的二叉树,一旦n确定,其树形就确定了,可以计算出高度h以及n0、n1和n2。其关系有:
h=log_2(n+1)
n1=0,n=2^h-1,n0=2^(h-1),n2^(h-1)-1
4.若 2i <= n,即为分支节点,否则为叶子节点
 若n为奇数,则每个分支节点都既有左孩子节点,也有右孩子节点;若n为偶数,则编号最大的分支节点只有左孩子节点,没有右孩子节点,其余分支节点都有左、右孩子节点。
5.若编号为i的节点有左孩子节点,则左孩子节点的编号为2i;若编号为i的节点有右孩子节点,则右孩子节点的编号为(2i+1)
6.除树根节点外,若一个节点的编号为i,则它的双亲节点的编号为[i/2],也就是说,当i为偶数时,其双亲节点的编号为i/2,它是双亲节点的左孩子节点,当i为奇数时,其双亲节点的编号为(i-1)/2,它是双亲节点的右孩子节点。
7.具有n个节点的完全二叉树具有的高度为log_2(n+1)或log_2n+1
8.若一棵二叉树是由森林转换而来的,若森林中有n个非终端节点,则二叉树中无右孩子的节点个数为n+1


猜你喜欢

转载自blog.csdn.net/play_841266670/article/details/72870446