码迷,mamicode.com
首页 > 其他好文 > 详细

华为机试—二叉树知识点

时间:2015-06-28 18:55:17      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:二叉树   二叉树高度   二叉树遍历   平衡二叉树   

建立一个二叉树,求其高度,首先前、中、后序遍历,求叶子数,求树深度并且判断是否为平衡二叉树。

二叉树是一个典型的数据结构,华为往年的试题中也有考到这个知识点的。

下面介绍几个树的重要性质:
性质1 二叉树第i层上的结点数目最多为2^(i-1)(i≥1)。
性质2 深度为k的二叉树至多有2^k-1个结点(k≥1)。
性质3 在任意-棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。

#include <stdio.h>
#include <stdlib.h>

// 二叉树结构体
typedef struct BiTNode  
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

// 创建二叉树
int CreateBiTree( BiTree &T )  
{
    char ch;
    ch=getchar();
    if( ch == ‘#‘ )
        T=NULL;
    else
    {
        if( ! ( T = ( BiTree )malloc( sizeof( BiTNode ) ) ) )
            exit( 0 );
        T->data = ch;
        CreateBiTree( T->lchild );
        CreateBiTree( T->rchild );
    }
    return 0;
}

// 二叉树输出
void Visit(BiTree T)    
{  
    if(T->data != ‘#‘)
    {  
        printf("%c ",T->data);  
    }  
} 

// 先序遍历  
void PreOrder(BiTree T)
{  
    if( T!=NULL )
    {   
        Visit(T);   
        PreOrder(T->lchild); 
        PreOrder(T->rchild);  
    }  
}

// 中序遍历    
void InOrder(BiTree T)
{    
    if( T!=NULL )
    {       
        InOrder(T->lchild);    
        Visit(T);       
        InOrder(T->rchild);    
    }    
} 

// 后序遍历  
void PostOrder(BiTree T)
{  
    if( T!=NULL )
    {    
        PostOrder(T->lchild);   
        PostOrder(T->rchild);  
        Visit(T);  
    }  
}

// 求二叉树叶子数
int sumleaf( BiTree T )  
{
    if( T!=NULL )
    {
        if( T->lchild || T->rchild )
            return( sumleaf( T->lchild ) + sumleaf( T->rchild ) );
        else
            return 1;
    }
    return 0;
}

// 返回两个整数中较大的一个
int themax( int a, int b )  
{
    if( a>b )
        return a;
    else 
        return b;
}

// 求二叉树的深度
int Depth( BiTree T )  
{
    if( T!=NULL )
        return( 1 + themax( Depth( T->lchild ), Depth( T->rchild ) ) );
    return 0;
}

// 判断二叉树是否为平衡二叉树
// 平衡二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
bool bebalance( BiTree T )
{
    if( T==NULL )
        return true;

    int ld=Depth(T->lchild);
    int lr=Depth(T->rchild);

    int di=abs(ld-lr);
    if(di>1)                 //根节点平衡
        return false;

    return bebalance(T->lchild) && bebalance(T->rchild);  //左右子树平衡
}

int main()
{
    BiTree T;  
    CreateBiTree(T);

    printf("先序遍历:\n");  
    PreOrder(T);  
    printf("\n");  

    printf("中序遍历:\n");  
    InOrder(T);  
    printf("\n"); 

    printf("后序遍历:\n");  
    PostOrder(T);  
    printf("\n");  


    printf("二叉树叶子数: %d\n", sumleaf( T ) );

    printf("二叉树深度: %d\n" , Depth( T ) );

    if(bebalance(T))
        printf("此二叉树是平衡二叉树\n");
    else
        printf("此二叉树不是平衡二叉树\n");

    return 0;
}

技术分享
技术分享

华为机试—二叉树知识点

标签:二叉树   二叉树高度   二叉树遍历   平衡二叉树   

原文地址:http://blog.csdn.net/wtyvhreal/article/details/46672835

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!