华为机试—二叉树知识点

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

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

下面介绍几个树的重要性质:

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

时间: 2024-08-06 07:56:28

华为机试—二叉树知识点的相关文章

华为机试—介绍、剖析、建议

一.华为机试介绍 1.大致介绍 时间:120分钟 环境:Visual Studio(去年是vs2005).Visual C++.VC 6.0.Eclipse(Java) 题量:共3题 初级题--60分--3组测试数据 中级题--100分--5组测试数据 高级题--160分--8组测试数据 注:初级题和中级题为必答题,高级题为附加题. 提交次数:每题最多5次 评判方式:按通过测试数据组数给分,每通过一组得20分 2.考试说明 这里有一个老版的机试考试说明,供大家参考: C/C++,JAVA机试流程

华为机试(A)

二叉树遍历        答题时间: 00 小时 03 分 11 秒 描述:  二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根. 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历). 题目类别:  树  难度:  中级  运行时间限制: 无限制 内存限

[华为机试真题]66.单词搜索

题目 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * 来源:华为机试真题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector> #include <stack> #include

华为机试正式版(西安c/c++/java),今天下午去机试的题目,新鲜出炉了!

以下题目都是回忆的,题目都很简单, 大家有些基础就可以参加!(语言可以是c/c++,也可以是java的) 题目一(60分): 字符串操作, 将小写转换成大写, 将大写转化为小写, 数字的不做转换 例如, 输入:aBcD12 输出:AbCd12 题目二(100分): 将输入的字符串按照规定重新排序,如果字符串长度为奇数, 则中间的字符保持不变, 中间字符左侧降序排列, 右侧字符按照升序排列, 如果字符串长度为偶数,则左半侧字符降序排列,右半侧字符则按照升序排列 例如, 输入:ab5de 输出:ba

华为机试 --- 求最大三位数

题目:输入10位0-9数字,取其中三位不同数字组合,求组合出来的最大三位数. 如输入 1 2 3 4 5 6 7 8 9 0,组合出来987最大. 测试代码如下: #include <stdio.h> #include <stdlib.h> int IsSame(int *a, int num); int main() { int i=0; int j=0; int a[10]={0}; int input =0; int length =0; int temp=0; for (i

[华为机试真题][2015]65.和尚挑水

题目 某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表: 和尚1: 星期二,四; 和尚2: 星期一,六; 和尚3: 星期三,日; 和尚4: 星期五; 和尚5: 星期一,四,六; 和尚6: 星期二,五; 和尚7: 星期三,六,日; 请将所有合理的挑水时间安排表 思路 回朔法求解 回朔法即每进行一步,都试图在当前部分解的基础上扩大该部分解.扩大时,首先检查扩大后是否违反了约束条件,若不违反,则扩大之,然后继续在此基础上按照类似的方法进行,直至成为完整解:若违反,则放弃该步

2014华为机试西安地区B组试题

2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生

[华为机试]输入数字的汉语拼音,每个拼音的首字母大写。输出该数字的阿拉伯数字。

//输入数字的汉语拼音,每个拼音的首字母大写.输出该数字的阿拉伯数字. //JiuBaiJiuShiJiu -> 999 #include<stdio.h> #include<string.h> int result = 0; void add(int n,char wei[]) { if(strcmp(wei,"Wan") == 0) result = result + n * 10000; else if(strcmp(wei,"Qian&q

华为机试(2)

简单题   题目描述  输入一个字符串,统计其出现频率最高的字符,并输出.若存在两个字符出现频率相同,则输出字典序较小的那一个   输入描述  :一个字符串,保证没有空格,以回车符结束,字符串长度<=20   输出描述  :一个字符   输入样例 :aabbaabb  输出样例  :a  解题思路:做一个频率数组来统计所有字符的出现频率,机试时候不会有汉字输入,因此只考虑输入是ASCII编码的情况. #include<string> #include<iostream> us