首页 > 二叉排序树的相关操作

二叉排序树的相关操作

#include 
#include 
//二叉树的生成和释放
typedef struct Node
{int data;struct Node * pParent;struct Node * pLeftChild;struct Node * pRightChild;
}Node;Node * Create_BTree(int *array,Node* pParent=NULL)//二叉排序树的创建,按照先序遍历的方法进行构造
{static int i=0;if (array[i]==0){return NULL;}Node *temp=(Node *)malloc(sizeof(Node));temp->data=array[i];temp->pParent=pParent;i++;temp->pLeftChild=Create_BTree(array,temp);i++;temp->pRightChild=Create_BTree(array,temp);return temp;
}
void Mid_Order(Node* tree)//二叉排序树的中序遍历
{if (tree==NULL){return;}Mid_Order(tree->pLeftChild);cout<data<<" ";Mid_Order(tree->pRightChild);
}
void Destroy_BTree(Node* tree)//二叉排序树的是否
{if (tree==NULL){return;}Destroy_BTree(tree->pLeftChild);Destroy_BTree(tree->pRightChild);free(tree);
}
Node* Tree_Search(Node* tree,int x)//二叉排序树的查找
{Node* temp=tree;while(temp){if(temp->data==x)break;else if(temp->data>x)temp=temp->pLeftChild;elsetemp=temp->pRightChild;}return temp;
}
Node * Tree_Minimum(Node* tree)//二叉排序树的最小节点
{while(tree&&tree->pLeftChild){tree=tree->pLeftChild;}return tree;
}
Node * Tree_Maximum(Node* tree)//二叉排序树的最大节点
{while(tree&&tree->pRightChild){tree=tree->pRightChild;}return tree;
}
Node * Tree_Successor(Node *p)//返回节点p的后继//中序遍历
{if(p==NULL)return p;else if(p->pRightChild)return Tree_Minimum(p->pRightChild);else{while(p->pParent&&p->pParent->pRightChild==p)p=p->pParent;return p->pParent;}}
Node *Tree_PreDecessor(Node* p)//中序遍历 求p的前驱节点
{if (p==NULL)return p;else if(p->pLeftChild)return Tree_Maximum(p->pLeftChild);else{while(p->pParent&&p->pParent->pLeftChild==p)p=p->pParent;return p->pParent;}
}
void  Tree_Insert(Node* &tree,int x)//给二叉排序树插入新节点
{Node * pNodeNew=(Node*)malloc(sizeof(Node));pNodeNew->pLeftChild=NULL;pNodeNew->pRightChild=NULL;pNodeNew->data=x;if(tree==NULL){pNodeNew->pParent=NULL;tree=pNodeNew;return;}Node * pTempParent=NULL,*pTemp=tree;while(pTemp){pTempParent=pTemp;if (pTemp->data<x){pTemp=pTemp->pRightChild;} else{pTemp=pTemp->pLeftChild;}}pNodeNew->pParent=pTempParent;if (pTempParent->data<x){pTempParent->pRightChild=pNodeNew;}elsepTempParent->pLeftChild=pNodeNew;
}
void Tree_Delete(Node* &tree,Node *p)//删除二叉排序树中一个节点
{if(p->pLeftChild==NULL&&p->pRightChild==NULL)//删除叶节点
    {Node *pParent=p->pParent;if (pParent){if (pParent->datadata){pParent->pRightChild=NULL;}elsepParent->pLeftChild=NULL;free(p);} else{tree=NULL;free(p);}}else if (p->pLeftChild&&p->pRightChild==NULL||p->pRightChild&&p->pLeftChild==NULL)//只有一个子树
    {Node *pParent=p->pParent;if (pParent){if (pParent->datadata)//子树连到父节点的右孩子
            {if(p->pLeftChild)//哪个子树不为空连哪个
                {pParent->pRightChild=p->pLeftChild;p->pLeftChild->pParent=pParent;}else{pParent->pRightChild=p->pRightChild;p->pRightChild->pParent=pParent;}free(p);}else{if(p->pLeftChild)//哪个子树不为空连哪个
                {pParent->pLeftChild=p->pLeftChild;p->pLeftChild->pParent=pParent;}else{pParent->pLeftChild=p->pRightChild;p->pRightChild->pParent=pParent;}free(p);    }} else{if(p->pLeftChild){p->pLeftChild->pParent=NULL;tree=p->pLeftChild;}else{p->pRightChild->pParent=NULL;tree=p->pRightChild;}free(p);}}else//有两个子树
    {Node *temp=Tree_Maximum(p->pLeftChild);int x=p->data;p->data=temp->data;temp->data=x;Tree_Delete(tree,temp);}
}
void main()
{int array[]={ 15,6,3,2,0,0,4,0,0,7,0,13,9,0,0,0,18,17,0,0,20,0,0};Node *tree=Create_BTree(array);Tree_Insert(tree,21);Mid_Order(tree);cout<<endl;Node *temp=Tree_Search(tree,7);//查找
    Tree_Delete(tree,temp);Mid_Order(tree);cout<<endl;Destroy_BTree(tree);
}

转载于:https://www.cnblogs.com/GoAhead/archive/2012/10/26/2741508.html

更多相关:

  • 二叉搜索树的编码和解码描述: 编码:即将一个二叉搜索树编码,节点数值转换为字符串 解码:即将一个字符串解码,数值转换为对应的二叉搜索树的节点 过程导图如下: 针对性编码实现如下: /*数字转字符串*/ void change_num_to_string(int val, string &tmp) {string buf;whil...

  • 二叉搜索树又名二叉排序树。 大概简略的思维导图如下,方便记忆特性 基本二叉搜索树创建过程如下 /*数据结构如下*/ typedef struct tree {int data;struct tree *left = NULL;struct tree *right = NULL; }Tree,*TreeNode;/*Node 为二...

  • Linux安装Nodejs       阿里云镜像: https://npm.taobao.org/mirrors/node/ 选择所需版本,进行下载。    我这边下载的是:https://npm.taobao.org/mirrors/node/v8.2.1/node-v8.2.1-linux-x64.tar.gz         ...

  • 1. HDFS Architecture 一种Master-Slave结构。包括Name Node, Secondary Name Node,Data Node Job Tracker, Task Tracker。JobTrackers: 控制全部的Task Trackers 。这两个Tracker将会在MapReduce课程里...

  • 下载Nodejs插件,下载zip压缩包后解压链接: http://pan.baidu.com/s/1hsBk60k 密码: jrcv打开Sublime Text3,点击菜单“首选项(N)” =>“浏览插件(B)”打开“Packages”文件夹,并将第1部的Nodejs文件夹剪切进来打开文件“Nodejs.sublime-build”,...

  • L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。 输入格...

  •  一个用于实现初始化指定个数的完全二叉树,以及两个非递归的深度优先遍历,和广度优先遍历 package fifth;  import java.util.Random;  public class Tool{     public static Random rand= new Random(); }  --------------...