zoukankan      html  css  js  c++  java
  • 二叉排序树-插入算法

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct BTNode{
     5     int key;
     6     BTNode *lchild;
     7     BTNode *rchild;
     8 }BTNode;
     9 
    10 int BSTInsert(BTNode *&p,int key)//用返回值判断插入是否成功
    11 {
    12     if(p==NULL)
    13     {
    14         p=(BTNode*)malloc(sizeof(BTNode));
    15         p->key=key;
    16         p->lchild=p->rchild=NULL;
    17         return 1;//成功插入
    18     }
    19     else
    20     {
    21         if(p->key==key) return 0;//已经存在相同值的结点,插入失败
    22         else
    23         {
    24             if(key < p->key)
    25             {
    26                 return BSTInsert(p->lchild,key);//去左子树
    27             }
    28             if(key > p->key)
    29             {
    30                 return BSTInsert(p->rchild,key);//去右子树
    31             }
    32         }
    33     }
    34 }
    35 int BFS(BTNode*p,int maxSize)
    36 {
    37     int front,rear;
    38     BTNode *que[maxSize];//采用循环队列,损失一个存储位置来实现队空和队满不同的判定条件
    39     front=rear=0;
    40     BTNode *q;
    41     if(p)//一般默认p是存在的,这里以防万一
    42     {
    43         rear=(rear+1)%maxSize;
    44         que[rear]=p;//根结点入队
    45         while(front!=rear)//循环队列队不空的条件(队满条件是(rear+1)%maxSize==front)(或者(front-1+maxSize)%maxSize==rear)
    46         {
    47             front=(front+1)%maxSize;
    48             q=que[front];//从“前面”出队
    49             printf("%d	", q->key);
    50             if(q->lchild)
    51             {
    52                 rear=(rear+1)%maxSize;
    53                 que[rear]=q->lchild;//左孩子非空,入队
    54             }
    55             if(q->rchild)
    56             {
    57                 rear=(rear+1)%maxSize;
    58                 que[rear]=q->rchild;//右孩子非空,入队                
    59             }
    60         }
    61     }
    62 }
    63 void inorder(BTNode*p)
    64 {
    65     if(p)
    66     {
    67         inorder(p->lchild);
    68         printf("%d	", p->key);
    69         inorder(p->rchild);
    70     }
    71 }
    72 int main(int argc, char const *argv[])
    73 {
    74     int a[]={9,7,8,6,5,3,4,2,1,1,1};//有重复节点
    75     int len=sizeof(a)/sizeof(int);
    76     BTNode *root=NULL;
    77     for(int i=0;i<len;i++)//不断地插入结点建成一棵二叉排序树
    78     {
    79         BSTInsert(root,a[i]);
    80     }
    81     // BFS(root,len);//层次遍历方式
    82     inorder(root);//中序遍历方式,正好配合二叉排序树,将其顺序打印出来
    83     return 0;
    84 }

    运行结果:

  • 相关阅读:
    65 进程互斥锁的优化实现
    Linux多线程编程
    互斥锁和自旋锁
    64 进程互斥锁的初步实现(下)
    63 进程互斥锁的初步实现(中)
    Linux中断子系统
    62 进程互斥锁的初步实现(上)
    61 进程互斥锁的详细设计
    Linux进程调度的时机
    嵌入式领域linux作为实时操作系统的缺点(转)
  • 原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/11850675.html
Copyright © 2011-2022 走看看