二叉树的遍历 插入 查找 删除 最大值 最小值 前驱 后继节点的查找
2015-04-29 21:57
801 查看
#include <iostream> #include<queue> using namespace std; //binery search-tree ADT struct treeNode { int value; treeNode* left; treeNode*right; treeNode*parent; }; //fun1 二叉树的插入即建立 treeNode * treeInsert(treeNode* head,int n) { treeNode* newNode=new treeNode; newNode->left=newNode->right=NULL; newNode->parent=NULL; newNode->value=n; if (head==NULL) { newNode->parent=NULL; return newNode; } treeNode *head1=head,*head2=NULL; while (head1!=NULL)//先确定待插入的父亲节点 { head2=head1; if(head1->value>n) head1=head1->left; else head1=head1->right; } newNode->parent=head2; if(head2->value>n) { head2->left=newNode; } else { head2->right=newNode; } return head; } void PrintInOrderTreeWalk(treeNode* head) { if(head!=NULL) { PrintInOrderTreeWalk(head->left); cout<<head->value<<" "; PrintInOrderTreeWalk(head->right); } } void PrintTreeWalkByFloor(treeNode* head) { if(head==NULL) return ; queue<treeNode*>myQueue; myQueue.push(head); treeNode* temp=NULL; while (!myQueue.empty()) { temp=myQueue.front(); cout<<temp->value<<" "; if(temp->left!=NULL) myQueue.push(temp->left); if(temp->right!=NULL) myQueue.push(temp->right); myQueue.pop(); } } treeNode* searchNode(treeNode * head,int k) { treeNode *head1=head; while (head1!=NULL&&head1->value!=k) { if(head1->value>k) head1=head1->left; else head1=head1->right; } return head1;//if 未找到return NULL } treeNode*Maximum(treeNode* head) { treeNode* head1=head,*head2=NULL; while (head1!=NULL) { head2=head1; head1=head1->right; } return head2; } treeNode* Minimum(treeNode *head) { treeNode* head1=head,*head2=NULL; while(head1!=NULL) { head2=head1; head1=head1->left; } return head2; } treeNode * Successor(treeNode * head,int k)//k中序遍历的后一个节点 { treeNode* kValueNode=searchNode(head,k);//先找到该节点 if(kValueNode==NULL) return NULL; if(kValueNode->right!=NULL) { return Minimum(kValueNode->right); } treeNode * y=kValueNode; while(y!=NULL&&((y->left)!=kValueNode)) { kValueNode=y; y=y->parent; } return y; } treeNode *Predecessor(treeNode * head,int k)//返回值为k的前一个节点 { treeNode* kValueNode=searchNode(head,k); if(kValueNode==NULL) return NULL; if(kValueNode->left!=NULL) { return Maximum(kValueNode); } treeNode* parent=kValueNode->parent; while(parent!=NULL&&(parent->right)!=kValueNode) { kValueNode=parent; parent=parent->parent; } return parent; } treeNode* deleteNode(treeNode* head,int value) { treeNode* head1=head; treeNode* toBeDeleteNode=searchNode(head,value); if(toBeDeleteNode==NULL) return NULL; if(toBeDeleteNode->left!=NULL&&toBeDeleteNode->right!=NULL)//如果待删节点有左右子树,用后续节点覆盖 { treeNode* next=Successor(toBeDeleteNode,toBeDeleteNode->value);//找到后续节点 toBeDeleteNode->value=next->value;//覆盖待删节点 next->parent->right=next->right;//让后续节点的父亲的右指针指向后续节点的右孩子 一定是左指针?反证法 if(next->right!=NULL) next->right->parent=next->parent; delete next;//删除后续节点 return head; } if(toBeDeleteNode==head) if(head1->left==NULL&&head1->right==NULL) { delete head1; return NULL; } else if (head1->left!=NULL) { head=head1->left; head->parent==NULL; delete head1; return head; } else { head=head1->right; head->parent==NULL; delete head1; return head; } bool isLeftChild=(toBeDeleteNode==toBeDeleteNode->parent->left); //isleftChile 表示待删节点是否为父亲的子节点 if(toBeDeleteNode->left!=NULL||toBeDeleteNode->right!=NULL)//待删节点只有一个孩子 { if(toBeDeleteNode->left==NULL) { if(isLeftChild) { toBeDeleteNode->parent->left=toBeDeleteNode->right; } else { toBeDeleteNode->parent->right=toBeDeleteNode->right; } toBeDeleteNode->right->parent=toBeDeleteNode->parent; delete toBeDeleteNode; return head; } if(toBeDeleteNode->right==NULL) { if(isLeftChild) { toBeDeleteNode->parent->left=toBeDeleteNode->left; } else { toBeDeleteNode->parent->right=toBeDeleteNode->left; } toBeDeleteNode->left->parent=toBeDeleteNode->parent; delete toBeDeleteNode; return head; } } else { if(isLeftChild) toBeDeleteNode->parent->left=NULL; else toBeDeleteNode->parent->right=NULL; delete toBeDeleteNode; return head; } } /*treeNode *transToList(treeNode *head)//将二叉树在不使用其它空间的情况下 转化为已排序的双向链表 { }*/ int main() { treeNode *head=NULL; head=treeInsert(head,2); head=treeInsert(head,4); head=treeInsert(head,1); head=treeInsert(head,18); head=treeInsert(head,23); head=treeInsert(head,78); head=treeInsert(head,89); //单元测试1: //head=searchNode(head,89); //head=Maximum(head); head=deleteNode(head,4); head=deleteNode(head,89); //if(head!=NULL) //cout<<head->value; PrintTreeWalkByFloor(head); //PrintInOrderTreeWalk(head); }
各操作的平均时间性能大都为O(lgn )花几个小时自己实现一遍还是很有收获的
相关文章推荐
- (Swift 实现)二叉搜索树 —— 创建,最大,最小,查找,插入,删除,前驱,后继,中序遍历
- 二叉搜索树的相关操作:插入节点,删除节点,排序,查找,最大值,最小值,前序,中序,后序遍历(主要用到递归的方法)
- 二叉查找树带父节点指针的创建,销毁,查找,删除,插入,找前驱后继,找最小值最大值(递归和非递归的实现)
- 二叉树的查找,插入,删除,遍历,最小值,最大值 操作
- (C语言)BinarySrearchTree二叉搜索树 --- 标准插入(递归,非递归)、遍历(前,中,后序)、查找(递归,非递归)、根插入递归(左旋,右旋)、最小最大值、删除节点
- 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法
- 二叉树的祖先结点,删除,插入,查找,前驱结点,后继结点等
- 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法
- 二叉查找树的查找,插入,最大/最小值查找,前驱/后续查找,删除算法[java]
- 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 二叉树2(二叉查找树的插入、查找、删除、遍历)
- 算法导论第十二章关于搜索二叉树的建立,查询,查找最大最小元素值,查找给定结点的直接后继
- C++ 二叉树(创建,遍历,查找,插入,删除)『菜鸟版』
- 数据结构(C#)--二叉查找树的先序,中序,后序的遍历问题以及最大值,最小值,插入,删除
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 【数据结构树表的查找】二叉排序树详解和代码(生成、插入、查找、最大值、最小值、删除、中序遍历、销毁)
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作
- 二叉树的遍历、查找、插入以及删除