二叉树

树的一些概念:(有些博客是错的,故此记一下)

树中节点

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; } 
           
          
        
       
       
      
      
     
     
    
    

结果:第一行为输入利用前序遍历生成树,其余为前,中,后序输出
无叶子节点输入'%'


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值