二叉查找树的简单操作(2)

   前段时间用指针,动态的方式把二叉查找树实现了!当时就想怎么用数组实现呢?

今天就用数组的方式实现了,话不多说了,把代码贴上吧!

  

 
 
  1. /* 
  2.  * maliao.cpp 
  3.  * 
  4.  *  Created on: 2012-9-24 
  5.  *      Author: Administrator 
  6.  */ 
  7. #include<stdio.h> 
  8. struct Node{ 
  9.     int value; 
  10.     int left,right; 
  11.     Node(){ 
  12.         left=right=value=-1; 
  13.     } 
  14. }; 
  15. #define MAX 100 
  16. Node tree[MAX]; 
  17. int idx,root; 
  18. //插入元素到树中 
  19. void insert(int id,int value){ 
  20.     if(id!=-1&&tree[id].value!=-1){ 
  21.         if(value>tree[id].value){ 
  22.             insert(tree[id].right,value); 
  23.             if(tree[id].right==-1) 
  24.                 tree[id].right=idx; 
  25.         }else if(value<tree[id].value){ 
  26.             insert(tree[id].left,value); 
  27.             if(tree[id].left==-1) 
  28.                 tree[id].left=idx; 
  29.         } 
  30.     }else
  31.         tree[++idx].value=value; 
  32.     } 
  33. //找到要删除结点的父结点,并确定当前结点是父结点的左孩子还是右孩子 
  34. inline bool search_for_delete(int &id,const int &value,int &parent,bool &rightChild){ 
  35.     parent=-1; 
  36.     if(id<0|| id>=MAX || tree[id].value==-1){ 
  37.         printf("error input!"); 
  38.         return false;} 
  39.     while(1){ 
  40.         if(value>tree[id].value){ 
  41.             parent=id;rightChild=1; 
  42.             id=tree[id].right; 
  43.         }else if(value<tree[id].value){ 
  44.             parent=id;rightChild=0; 
  45.             id=tree[id].left; 
  46.         }else
  47.             return true
  48.         } 
  49.         if(id==-1){ 
  50.             printf("No element %d in the tree!\n",value); 
  51.             return false
  52.         } 
  53.     } 
  54. //找到当前结点的第一个左叶子结点 
  55. inline int findFirstLeftLeaf(int id){ 
  56.     int cid; 
  57.     while(id!=-1){ 
  58.         cid=id; 
  59.         id=tree[id].left; 
  60.     } 
  61.     return cid; 
  62. //从查找树中删除一个元素 
  63. void deleteElement(int id,int value){ 
  64.     int parent;bool rightChild; 
  65.     bool find=search_for_delete(id,value,parent,rightChild); 
  66.     if(find){ 
  67.         //分四种情况讨论 
  68.         /* 0、是根结点,将右孩子作为根结点,然后处理方式与2一样 
  69.          * 1、是叶子结点,直接删除,将父结点的当前孩子置为-1 
  70.          * 2、非叶子结点,有两个孩子,左孩子连接到右孩子的第一个左叶子结点,右孩子作为到父结点的当前孩子 
  71.          * 3、非叶子结点,有左孩子或者右孩子,孩子直接连接到父结点上 
  72.          * 
  73.          * */ 
  74.         if(parent==-1){//根结点 
  75.             root=tree[id].right; 
  76.             //找到右孩子的第一个左叶子结点 
  77.             int fll=findFirstLeftLeaf(tree[id].right); 
  78.             //把左孩子连接到叶子结点上 
  79.             tree[fll].left=tree[id].left; 
  80.  
  81.         }else if(tree[id].left==-1&&tree[id].right==-1){//叶子结点 
  82.             rightChild==true ? 
  83.                 tree[parent].right=-1:tree[parent].left=-1; 
  84.         }else if(tree[id].left!=-1){//只有左孩子 
  85.             rightChild==true ? 
  86.                     tree[parent].right=tree[id].left : tree[parent].left=tree[id].left; 
  87.         }else if(tree[id].right!=-1){//只有右孩子 
  88.             rightChild==true ? 
  89.                     tree[parent].right=tree[id].right : tree[parent].left=tree[id].right; 
  90.         }else{//有两个孩子 
  91.             //找到右孩子的第一个左叶子结点 
  92.             int fll=findFirstLeftLeaf(tree[id].right); 
  93.             //把左孩子连接到叶子结点上 
  94.             tree[fll].left=tree[id].left; 
  95.             rightChild==true ? 
  96.                 tree[parent].right=tree[id].right : tree[parent].left=tree[id].right; 
  97.  
  98.         } 
  99.         //删除结点 
  100.         tree[id].value=-1; 
  101.         tree[id].left=tree[id].right=-1; 
  102.     } 
  103. void orderPrint(int id){ 
  104.     if(id!=-1){ 
  105.         orderPrint(tree[id].left); 
  106.  
  107.         printf("%d ",tree[id].value); 
  108.  
  109.         orderPrint(tree[id].right); 
  110.     } 
  111. void init(){ 
  112.     idx=-1;root=0; 
  113. int main(){ 
  114.     int a[10]={1,2,8,9,3,4,5,6,7,0}; 
  115.     init(); 
  116.     for(int i=0;i<10;i++){ 
  117.         insert(root,a[i]); 
  118.     } 
  119.     //删除元素 
  120.     deleteElement(root,1); 
  121.     //将元素按中序遍历输出 
  122.     orderPrint(root); 
  123.     return 0; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值