二叉树建立、前序、中序、后序、树深度求解

在学习二叉树之前,我们先了解一下

什么是二叉树大笑

      在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作左子树left subtree)和右子树right subtree)。二叉树常被用于实现二叉查找树和二叉堆。

        二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1

        一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1n的节点对应时,称之为完全二叉树。

二叉树的应用

       应用极为广泛,因为根据数据结构的理论,任何复杂的树够可以转换为二叉中并进行处理,二叉树再排序、查找、大规模数据索引方面有很多很多应用,二叉树排序是简单算法排序中速度最快的

文件系统数据库系统一般都采用树(特别是B树)的数据结构数据,主要为排序和检索的效率。二叉树是一种最基本最典型的排序树,用于教学和研究树的特性,本身很少在实际中进行应用,因为缺点太明显了(看看教科书怎么说的)。就像冒泡排序一样,虽然因为效率问题并不实用,单不失一种教学例子的好手段。

各类树的缺点

二叉树

优点:查找,插入,删除都快(如果数保持平衡)

缺点:删除算法复杂

-黑树

优点:查找,插入,删除都快,树总是平衡的

缺点:算法复杂

2-3-4

优点:查找,插入,删除都快,树总是平衡的。类似的树对磁盘存储有用

缺点:算法复杂

 

初步认识了二叉树之后我们就开始了解二叉树的基本概念


首先,一棵二叉树,可以分为左子树右子树(如上图所示),且每个子树也是二叉树

(上图的二叉树深度为4)

 

先序遍历规则:根节点->左子节点->右子节点

以上图为例子:则输出结果为:ABDCEFG

中序遍历规则:左子节点->根节点->右子节点

以上图为例子:则输出结果为:BDACFEG

后序遍历规则:左子节点->右子节点->根节点

以上图为例子:则输出结果为:DBFGECA

不理解的读者们可以先从深度为2的二叉树开始理解。

附上代码

 

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"memwatch.h"
/*
输入序列ABC##DE#G##F###(其中的“#”表示空,并且输入过程中不要加回车,因为回车也有对应的ASCII码,是要算字符的,但是输入完之后可以按回车退出),这时候就能够看到结果了。
*/
 
typedefstructBTree
{
    chardata;
    structBTree*lchild,*rchild;
}BTree;
 
BTree*createTree()//创建树
{
    BTree*tmp=NULL;
    charch;
    scanf("%c",&ch);
    if(ch!='#'&&ch!='\n')
    {
        tmp=(BTree*)malloc(sizeof(BTree));
        tmp->data=ch;
        tmp->lchild=createTree();
        tmp->rchild=createTree();
    }
    returntmp;
}
 
intPreOrdertraversal(BTree*phead)//前序遍历
{
    printf("%c",phead->data);
    if(phead->lchild!=NULL)
        PreOrdertraversal(phead->lchild);
    if(phead->rchild!=NULL)
        PreOrdertraversal(phead->rchild);
    return0;
}
 
intInOrdertraversal(BTree*phead)//中序遍历
{
    if(phead->lchild)
        InOrdertraversal(phead->lchild);
    printf("%c",phead->data);
    if(phead->rchild)
        InOrdertraversal(phead->rchild);
    return0;
}
 
intPostOrdertraversal(BTree*phead)//后序遍历
{
    if(phead->lchild!=NULL)
        PostOrdertraversal(phead->lchild);
    if(phead->rchild!=NULL)
        PostOrdertraversal(phead->rchild);
    printf("%c",phead->data);
    return0;
}
 
intTraversalDeep(BTree*phead)//求出树的深度
{
    if(phead==NULL)
        return0;
    intdeep1=1;
    intdeep2=1;
    deep1=1+TraversalDeep(phead->lchild);
    deep2=1+TraversalDeep(phead->rchild);
 
    returndeep1>deep2?deep1:deep2;
}
 
intDestroyBTree(BTree*phead)//销毁二叉树
{
    BTree*tmp;
    if(phead==NULL)
        return-1;//error
    tmp=phead;
    if(tmp->lchild!=NULL)
    {
        DestroyBTree(tmp->lchild);
        tmp->lchild=NULL;
    }
    if(tmp->rchild!=NULL)
    {
        DestroyBTree(tmp->rchild);
        tmp->rchild=NULL;
    }
    free(tmp);
    tmp=NULL;
    return0;//success
 
}
 
 
intmain(void)
{
    BTree*phead=NULL;
    phead=createTree();
    PreOrdertraversal(phead);
    printf("\n");
    InOrdertraversal(phead);
    printf("\n");
    PostOrdertraversal(phead);
    intdeep=TraversalDeep(phead);
    printf("%d\n",deep);
    DestroyBTree(phead);
    printf("\n");
    system("pause");
    return0;
}



 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值