二叉查找树的创建、(前、中、后)序遍历(递归)以及遍历算法的应用

二叉查找树的创建

  1. 首先创建二叉树的结点的结构
//创建一颗二叉树结点的结构 
typedef struct node{
    int data;               //数据域 
    struct node *right;     //指向左子女的指针域 
    struct node *left;      //指向右子女的指针域 
}BTNode;
  1. 然后在创建二叉树
    两指针联动:一个指针用于比较数据域大小,另一指针指向该子女的双亲结点。
    函数形参变量是数组以及数组长度;返回值是根节点
//创建一颗二叉查找树(左子女比右子女大) 
BTNode *CreatBTNode(int a[],int n)
{
    BTNode *root,*pa,*c,*p;

    root = (BTNode *)malloc(sizeof(BTNode));
    root->data=a[0];
    root->right=root->left=NULL;

    int i;
    for(i=1;i<n;i++)
    {
        p=(BTNode *)malloc(sizeof(BTNode));
        p->data=a[i];
        p->right=p->left=NULL;
        c=root;

        while(c)
        {
            pa=c;
            if(c->data > p->data)
            {
                c=c->left;
            }else{
                c=c->right;
            }
        }

        if(pa->data > p->data)
        {
            pa->left=p; 
        }else{
            pa->right=p;
        }
    }
    return root;
}

前序遍历 、中序遍历以及后序遍历##

  1. 前序遍历
    思想:首先访问根节点;
    再遍历左节点;
    最后遍历右节点;

    代码:

//前序遍历 
void FOrder(BTNode *root)
{
    if(root)
    {
        printf("%5d",root->data);
        FOrder(root->left);
        FOrder(root->right);
    }
 } 
  1. 中序遍历
    思想:首先访问左节点;
    再遍历根节点;
    最后遍历右节点;

    代码:

//中序遍历
 void InOrder(BTNode *root)
 {
    if(root)
    {
        InOrder(root->left);
        printf("%5d",root->data);
        InOrder(root->right);
     }
  }
  1. 后序遍历
    思想:首先访问左节点;
    再遍历右节点;
    最后遍历根节点;

    代码:

//后序遍历
  void POrder(BTNode *root)
  {
    if(root)
    {
        POrder(root->left);
        POrder(root->right);
        printf("%5d",root->data);
      }
   }

遍历算法的应用

  1. 叶子结点的个数
    三种遍历算法都可以实现,关键在于在编历过程中,判断一个结点是否是叶子节点。
    下面给出前序遍历实现的代码:
int leaf(BTNode *root)
{
    int suml=0,sumr=0;
    if(root)
    {
        if(!root->left && (!root->right))
        {
            return 1;
        }
        suml=leaf(root->left);
        sumr=leaf(root->right);
    }
    return suml+sumr;
}

2.有左右子女结点的个数
三种遍历算法都可以实现,将访问操作改为累计数操作即可
下面给出前序遍历实现的代码:

//求有左右子女结点的个数
void  parent(BTNode *root)
{
    if(root)
    {
        if(root->left&&root->right)
        {
            count++;    //count为全局变量 
        }
        parent(root->left);
        parent(root->right);
    }
 } 

3.二叉树的高度
思想:若为空树,则高度为0,否则,树高应为左、右子树高度的最大值加1,此方法必须在左、右子树高度求出后,才可求出树的高度,因此只能用后序遍历

代码:

//求二叉树的高度 
 int PostTreeDepth(BTNode *root)
 {
    int hl,hr,h;
    if(root)
    {
        hl=PostTreeDepth(root->left);
        hr=PostTreeDepth(root->right);
        h=(hl>hr? hl:hr)+1;
        return h;
    }else{
        return 0;
    }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值