二叉查找树的操作
2012-07-07 13:58
218 查看
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct Node { int data; Node* lc,*rc,*parent; }*BiTree; BiTree root; int a[100]; int n; void CreateTree(BiTree& T ,int v) // 注意此处类型,对指针的引用,使得指针不会在返回时有变为空指针 { if(!T) { if(!(T=new Node())) exit(0); T->data=v; T->lc=NULL; T->rc=NULL; T->parent=NULL; } else { if(v<T->data) { CreateTree(T->lc,v); T->lc->parent=T; } else { CreateTree(T->rc,v); T->rc->parent=T; } } } void Built(BiTree&T, int v) //非递归版本 { BiTree cur,p=T; while(p) { if(p->data==v) return; cur=p; p=(p->data>v)? p->lc:p->rc; } p=new Node(); p->data=v; p->lc=p->rc=p->parent=NULL; if(!T) T=p; else { p->parent=cur; if(cur->data>v) cur->lc=p; else cur->rc=p; } } BiTree getMin(BiTree T) { while(T->lc) T=T->lc; return T; } BiTree getMax(BiTree T) { while(T->rc) T=T->rc; return T; } BiTree Successor(BiTree T) //求后继 { if(!T) return T; if(T->rc) //右子树不为空,返回右子树最左边的节点 { T= getMax(T); return T; } BiTree y=new Node(); y=T->parent; while(y&&y->rc==T) //右子树不为空 { T=y; y=y->parent; } return y; } BiTree Precessor(BiTree T) //求前驱节点 { if(!T) return T; if(T->lc) //左子树不为空,返回左子树最右方的节点 { T= getMin(T); return T; } BiTree y=new Node(); //左子树为空 y=T->parent; while(y&&y->lc==T) { T=y; y=y->parent; } return y; } bool DeleteNode(BiTree T) //当要删除的节点左右节点不为空时,采取的不是删除该节点的方法,而是修改该节点的关键字为其后继节点 { if(!T) return false; BiTree y=new Node(); BiTree x=new Node(); y=T; if(T->lc&&T->rc) //当T的左右子树都不为空时,返回的是该点的后继 y=Successor(T); if(y->lc) x=y->lc; else x=y->rc; if(x) x->parent=y->parent; if(!(y->parent)) //当要删除的节点为根节点时,令x为根节点 root=x; else if(y==y->parent->lc) //修改,删除后继节点后给其他节点指针带来的变化 y->parent->lc=x; else y->parent->rc=x; if(y!=T) //将要删除节点的域值改为后继节点的 T->data=y->data; return true; } int Print(int v) { printf("%d\n",v); return 1; } int PostOrderTraverse(BiTree T,int(*visit)(int)) { if(T) { PostOrderTraverse(T->lc,visit); PostOrderTraverse(T->rc,visit); if(visit(T->data)) return 1; return 0; } return 1; } int main() { n=0; int x; Node* T=NULL; root =new Node(); root=T; while(scanf("%d",&x)!=EOF) { // CreateTree(T,x); Built(T,x); } BiTree test=new Node(); test=T; test=Successor(T); if(test) printf("后继是: %d\n",test->data); else printf("无后继\n"); test=Precessor(T->lc->lc->rc); if(test) printf("前驱是: %d\n",test->data); else printf("无前驱\n"); if(DeleteNode(T->lc->lc)) printf("删除成功\n"); PostOrderTraverse(T,Print); return 0; }
相关文章推荐
- 二叉排序树(二叉查找树)的基本操作
- 二叉查找树的删除操作
- 二叉查找树删除操作
- 二叉查找树的一些操作(search,getminvalue,get maxvalue,insert)
- 二叉查找树的操作
- 二叉查找树的各种操作C++实现
- 非递归实现二叉查找树插入操作
- 二叉查找树的操作
- 二叉查找树的基本操作实现
- 二叉查找树的基本操作之查找插入删除
- 数据结构与算法分析--二叉排序树(二叉查找树,二叉搜索树)的查找、插入和删除操作
- 二叉查找树的基本操作
- 【算法设计-二叉搜索树】二叉查找树的操作与实现
- 基于 Python 的数据结构与算法分析学习记录(6-11)—— 二叉查找树与操作
- 二叉查找树的各种操作C++实现
- 二叉查找树(Binary Search Tree)--结点的删除操作(导入自原博客)
- BST二叉查找树的实现与操作
- 二叉排序树(二叉查找树)的各种操作C++最新实现
- 二叉查找树的简单操作
- java二叉查找树的基本操作