二叉树的基本操作
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;
}
//
#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;
}
相关文章推荐
- 二叉树的基本操作实现(递归和非递归)
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本遍历操作
- 数据结构——排序/搜索二叉树(非递归)的基本操作实现
- 数据结构复习——二叉树的几个基本操作
- 数据结构 — 二叉树的基本操作(递归实现)
- 二叉树的基本操作
- 二叉树基本操作(输出所有叶子节点到根节点的路径)
- 【数据结构笔记】二叉树的基本操作
- 二叉树及二叉树的基本操作(基础面试题型)
- 二叉树的基本操作
- 二叉树的基本操作及打印
- 二叉树基本操作(完整版)
- 二叉树查找树的基本操作
- C二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 二叉树操作的基本操作
- 二叉树的基本操作(C语言版)
- 二叉树的基本操作
- 二叉树的基本操作(一)