二叉查找树的创建

不定期更新的程序分享

    今天刚学了二叉树的建立,刚开始可是懵啊,倒腾了半天才自己理解喽,

其实二叉树的创建和链表的创建大同小异,只是多了与前驱结点的比较,以及比较后向左还是向右创建,也可以理解成链表是二叉树的特殊情况。

 

以下为整个程序以及自己的一些注释(Vc++)

 #include <stdio.h>
 #include <stdlib.h>
typedef struct node{               //把一个结点看成三个部分,data表示节点的数值,left表示左子女,right则表示右结点
 int data;
 struct node *left;
 struct node *right;
}BTnode;

BTnode *Creat(int a[],int N)
{
 BTnode *root,*p,*c,*pa;        //定义root为根结点,pa为双亲结点
 int i;
 root=(BTnode *)malloc(sizeof(BTnode));
 root->data=a[0];               //初始化root,数组的第一个数为根节点,
 root->left=root->next=NULL;    //设根节点的后继结点为空
 for(i=1;i<N;i++)
 {
  p=(BTnode *)malloc(sizeof(BTnode));   //定义一个p结点,用来接收数组中的数据
  p->data=a[i];
  p->left=p->right=NULL;    //设p结点的后继结点也为空
  c=root;                   //注意:每次开始新一轮的循环时,都是c指向root
  while(c){                 //判断当c为空时跳出循环
                            /*第一次循环:pa和c指向根节点;循环结束,c指向了c的left或right,这时pa是c的双亲结点,
                               若c仍不为空,pa则指向c指向的结点,c又继续指向c的left或right,pa则一直是c的双亲结点,如此类推*/
             pa=c;        
    if(c->data>p->data)  //此次比较是就root而言,应该向左还是向右创建,定个大方向
     c=c->left;
    else
     c=c->right;
  }
  if(pa->data>p->data)      //此次比较是和前驱直接比较,若小于前驱,为左子女结点,否则右子女结点,直接与前驱挂链
   pa->left=p;
  else
   pa->righ   t=p;
 }
 return root; 
}

 

 

 

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/alegria_x/article/details/80087798
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞