二叉树的基本操作--1

时间:2021-04-11 17:32:04
/*
*二叉树基本操作 范例
*/


//需要的头文件
#include <stdio.h>
#include <stdlib.h>


//节点的结构类型
typedef struct BiNode{
   int data;
   struct BiNode * Lchild;//左孩子
   struct BiNode * Rchild;//右孩子
}BiNode,*BiTree;


/*创建一个空的二叉树
*创建成功返回节点指针,否则返回空
*/
int init(BiTree &T){
    if(T=(BiNode *)malloc(sizeof(BiNode))){
    T->Lchild=NULL;
    T->Rchild=NULL;
    return 1;
   }else{
   return 0;
   }
}

/*
*销毁二叉树
*/

void Destory(BiTree &T){
   if(T){
     Destory(T->Lchild);
     Destory(T->Rchild);
     free(T);
     T=NULL;
   }
}
/*删除某节点左子树,已知二叉树及节点pt*/
void DeleteL(BiTree &T,BiTree pt){
   if(pt==NULL||pt->Lchild==NULL)
     return;
   Destory(pt->Lchild);
   pt->Lchild=NULL;
}
/*删除某节点右子树,已知二叉树及节点pt*/
void DeleteR(BiTree &T,BiTree pt){
   if(pt==NULL||pt->Lchild==NULL)
     return;
   Destory(pt->Rchild);
   pt->Lchild=NULL;
}

void InsertL(BiTree &T,int e,BiTree pt){
  BiTree p;
  //该节点存在的情况下
  if(pt){
    if(p=(BiNode *)malloc(sizeof(BiNode))){
        p->data=e;
        p->Lchild=pt->Lchild;
        p->Rchild=pt->Rchild;
        pt->Lchild=p;//最后把将pt的左孩子变成p
    }
  }
}

void InsertR(BiTree &T,int e,BiTree pt){
  BiTree p;
  //该节点存在的情况下
  if(pt){
    if(p=(BiNode *)malloc(sizeof(BiNode))){
        p->data=e;
        p->Lchild=pt->Lchild;
        p->Rchild=pt->Rchild;
        pt->Rchild=p;//最后把将pt的右孩子变成p
    }
  }
}

/*
*二叉树遍历
*先序,中序,后序
*/
//先序
void Preorder(BiTree T){
   if(T){
    printf("%d",T->data);
    Preorder(T->Lchild);
    Preorder(T->Rchild);
   }
}
//中序
void Inorder(BiTree T){
  if(T){
    Inorder(T->Lchild);
    printf("%d",T->data);
    Inorder(T->Rchild);
  }
}
//后序
void Postorder(BiTree T){
   if(T){
    Postorder(T->Lchild);
    Postorder(T->Rchild);
    printf("%d",T->data);
   }
}