您的位置:首页 > 其它

二叉树的基本操作

2015-05-08 19:39 281 查看
// 树.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "malloc.h"

#include<stdlib.h>

#include<stdio.h>

typedef struct BSTNode//二叉排序树结点

{

 int data;

 struct BSTNode *lchild,*rchild;

    

}BSTNode,*BiTree;

bool BST_Insert(BiTree &T,int k)//二叉排序树的插入

{

 if (T==NULL)

 {

  T=(BiTree)malloc(sizeof(BSTNode));

  T->data=k;

  T->lchild=T->rchild=NULL;

  return true;  //表示插入成功

 }

 else if (k==T->data)

  return false;  //插入失败

 else if (k<T->data)

  return BST_Insert(T->lchild,k); //插入到T的左子树

 else

  return BST_Insert(T->rchild,k);//插入到T的右子树

}

void CreateBST(BiTree &T,int key[],int n)//二叉排序树的构造

{//用关键字数组str[]建立一个二叉排序树

 T=NULL ;  //初试BST为空树

    int i=0;

 while(i<n)

 {

  BST_Insert(T,key[i]);

  i++;

 }

}

void visit(BSTNode *p)

{

 printf("%d ",p->data);

}

void PreOrder(BiTree T)

{//

 if(T!=NULL)

 {

  visit(T);

  PreOrder(T->lchild);

  PreOrder(T->rchild);

 }

}

void InOrder(BiTree T)

{//

 if(T!=NULL)

 {

  InOrder(T->lchild);

  visit(T);

  InOrder(T->rchild);

 }

}

BSTNode* BST_Search(BiTree T,int key,BSTNode *&p)//二叉排序树的非递归查找算法

{//查找函数返回指向关键字值为key的结点指针及其双亲指针,若不存在,返回NULL

 p=NULL;//p指向被查找结点的双亲结点,用于删除,插入

 while(T && T->data!=key)

 {

  p=T;

  if (key<T->data)

   T=T->lchild;

  else T=T->rchild;

 }

 return T;

}

BSTNode* NextNode(BSTNode* p)

{//中序二叉排序树种结点p在中序序列下的后继结点

 /*BSTNode *q=p->rchild;*/

 if (p)

 {

  p=p->rchild;

  if (p)

  {

   while (p->lchild)

    p=p->lchild;

  }

 }

 return p;

}

BSTNode* BST_Delete(BiTree &T,int key)

{//二叉排序树的删除

 BSTNode *p,*q,*next;

 q=BST_Search(T,key,p);//找到删除结点q,及其双亲结点

    if (q==NULL)

  return NULL;

   

 if (q->lchild == NULL && q->rchild==NULL)//如果q是叶子结点

 {

  if(p->lchild==q)

   p->lchild=NULL;

  else if (p->rchild==q)

   p->rchild=NULL;

  //free(q);//释放结点

 }

 else if (q->lchild && q->rchild)//如果q有左右两棵子树

 {

  next=NextNode(q);//next肯定存在

  //转换为去掉next结点

  //printf("%d\n",next->data);

  BST_Delete(T,next->data);

   next->lchild=q->lchild;

   next->rchild=q->rchild;

  if (p)

  {

   if(p->lchild==q)

    p->lchild=next;

   else if (p->rchild == q)

    p->rchild=next;

  }

  else//该结点是根结点

  {

   T=next;//调试出来的关键代码。 坚持就是胜利!!!

  }

  //free(q);//释放结点

 }

 else //q只有一颗子树

 {

  if(p->lchild==q)

  {

   if (q->lchild==NULL)

    p->lchild=q->rchild;

   else

    p->lchild=q->lchild;

  }

  else if (p->rchild==q)

  {

   if (q->lchild==NULL)

    p->rchild=q->rchild;

   else

    p->rchild=q->lchild;

  }

 }

 return q;

}

int _tmain(int argc, _TCHAR* argv[])

{

 BiTree T;

 int n=8;

 int key[8]={3,2,5,4,1,6,7,8};

 CreateBST(T,key,n);//建立二叉排序树

 PreOrder(T);  //前序遍历

 printf("\n");

    InOrder(T);//中序就是key的顺序

 printf("\n");

////////////////////////////////////

 /*BSTNode *p,*q;

 q=BST_Search(T,3,p);

 if (p)

  printf("%d\n",p->data);

    p=NextNode(q);

 

 if (p)

  printf("%d\n",p->data);*/

    //////////////////////////////////////////////////////////////////////////

 BST_Delete(T,5);

 

 /////////////////测试,二叉树先序加中序或者中序加后序能唯一确定一颗二叉树//////////////////////////////////////////

  PreOrder(T);

 printf("\n");

  InOrder(T);

  printf("\n");

 return 0;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息