前段时间用指针,动态的方式把二叉查找树实现了!当时就想怎么用数组实现呢?
今天就用数组的方式实现了,话不多说了,把代码贴上吧!
- /*
- * maliao.cpp
- *
- * Created on: 2012-9-24
- * Author: Administrator
- */
- #include<stdio.h>
- struct Node{
- int value;
- int left,right;
- Node(){
- left=right=value=-1;
- }
- };
- #define MAX 100
- Node tree[MAX];
- int idx,root;
- //插入元素到树中
- void insert(int id,int value){
- if(id!=-1&&tree[id].value!=-1){
- if(value>tree[id].value){
- insert(tree[id].right,value);
- if(tree[id].right==-1)
- tree[id].right=idx;
- }else if(value<tree[id].value){
- insert(tree[id].left,value);
- if(tree[id].left==-1)
- tree[id].left=idx;
- }
- }else{
- tree[++idx].value=value;
- }
- }
- //找到要删除结点的父结点,并确定当前结点是父结点的左孩子还是右孩子
- inline bool search_for_delete(int &id,const int &value,int &parent,bool &rightChild){
- parent=-1;
- if(id<0|| id>=MAX || tree[id].value==-1){
- printf("error input!");
- return false;}
- while(1){
- if(value>tree[id].value){
- parent=id;rightChild=1;
- id=tree[id].right;
- }else if(value<tree[id].value){
- parent=id;rightChild=0;
- id=tree[id].left;
- }else{
- return true;
- }
- if(id==-1){
- printf("No element %d in the tree!\n",value);
- return false;
- }
- }
- }
- //找到当前结点的第一个左叶子结点
- inline int findFirstLeftLeaf(int id){
- int cid;
- while(id!=-1){
- cid=id;
- id=tree[id].left;
- }
- return cid;
- }
- //从查找树中删除一个元素
- void deleteElement(int id,int value){
- int parent;bool rightChild;
- bool find=search_for_delete(id,value,parent,rightChild);
- if(find){
- //分四种情况讨论
- /* 0、是根结点,将右孩子作为根结点,然后处理方式与2一样
- * 1、是叶子结点,直接删除,将父结点的当前孩子置为-1
- * 2、非叶子结点,有两个孩子,左孩子连接到右孩子的第一个左叶子结点,右孩子作为到父结点的当前孩子
- * 3、非叶子结点,有左孩子或者右孩子,孩子直接连接到父结点上
- *
- * */
- if(parent==-1){//根结点
- root=tree[id].right;
- //找到右孩子的第一个左叶子结点
- int fll=findFirstLeftLeaf(tree[id].right);
- //把左孩子连接到叶子结点上
- tree[fll].left=tree[id].left;
- }else if(tree[id].left==-1&&tree[id].right==-1){//叶子结点
- rightChild==true ?
- tree[parent].right=-1:tree[parent].left=-1;
- }else if(tree[id].left!=-1){//只有左孩子
- rightChild==true ?
- tree[parent].right=tree[id].left : tree[parent].left=tree[id].left;
- }else if(tree[id].right!=-1){//只有右孩子
- rightChild==true ?
- tree[parent].right=tree[id].right : tree[parent].left=tree[id].right;
- }else{//有两个孩子
- //找到右孩子的第一个左叶子结点
- int fll=findFirstLeftLeaf(tree[id].right);
- //把左孩子连接到叶子结点上
- tree[fll].left=tree[id].left;
- rightChild==true ?
- tree[parent].right=tree[id].right : tree[parent].left=tree[id].right;
- }
- //删除结点
- tree[id].value=-1;
- tree[id].left=tree[id].right=-1;
- }
- }
- void orderPrint(int id){
- if(id!=-1){
- orderPrint(tree[id].left);
- printf("%d ",tree[id].value);
- orderPrint(tree[id].right);
- }
- }
- void init(){
- idx=-1;root=0;
- }
- int main(){
- int a[10]={1,2,8,9,3,4,5,6,7,0};
- init();
- for(int i=0;i<10;i++){
- insert(root,a[i]);
- }
- //删除元素
- deleteElement(root,1);
- //将元素按中序遍历输出
- orderPrint(root);
- return 0;
- }