树-C实现
来源:互联网 发布:战国鬼才传 知乎 编辑:程序博客网 时间:2024/06/10 22:47
注意事项
1.可能存在变量名大小问题
2.注意定义例如ElementType
二叉树
层次建立二叉树
BinTree* CreateBinTree(){ int Data; BinTree* BT,*T; Queue* Q = CreateQueue(); scanf("%d",&Data); //建立根节点 if(Data){ BT = (BinTree*)malloc(sizeof(BinTree)); BT->Data = Data; Add(Q,BT); }else{ return NULL; } while(!IsEmptyQ(Q)){ T = DeleteQ(Q); scanf("%d",&Data); //读入左孩子 if(!Data) T->Left = NULL; else{ T->Left = (BinTree*)malloc(sizeof(BinTree)); T->Left->Data = Data; AddQ(Q,T->Left); } scanf("%d",&Data);//读入右孩子 if(!Data) T->Right = NULL; else{ T->Right = (BinTree*)malloc(sizeof(BinTree)); T->Right->Data = Data; AddQ(Q,T->Right); } } return BT;}
树的高度
int PostOrderGetHeight(BinTree *BT){ int HL,HR,MaxH; if(BT){ HL = PostOrderGetHeight(BT->Left); HR = PostOrderGetHeight(BT->Right); MaxH = HL > HR ? HL : HR; return (MaxH + 1); }else{ return 0; }}
层次遍历
void LevelOrderTraversal ( BinTree BT){ Queue *Q; BinTree* T; if(!BT) return; Q = CreateQueue(); AddQ(Q,BT); while(!IsEmptyQ(Q)){ T = DeleteQ(Q); printf("%d",T->Data); if(T->Left) AddQ(Q,T->Left); if(T->Right) AddQ(Q,T->Right); }}
后序非递归
void PostOrder(BinTree *BT){ BinTree *cur; BinTree *Pre = NULL; Stack *S = CreateStack(); Push(S,BT); while(!IsEmpty()){ cur = PtrS->Data[(PtrS->Top)]; if( (cur->Left == NULL && cur->Right == NULL) || (pre != NULL && (pre == cur->Left ||pre == cur->Right ))){ printf("%d",cur->Data); Pop(S); pre = cur; }else{ if(cur->Right) Push(cur->Right); if(cur->Left) Push(cur->Left); } }}
前序非递归
void PreOrder(BinTree *BT){ BinTree *T; Stack *S = CreateStack(); T = BT; while(T || !IsEmpty(S) ){ while(T){ ////一直向左并将沿途结点压入堆栈 printf("%d",T->Data);//打印结点 Push(S,T); T = T->Left; } T = Pop(S); //结点弹出堆栈 T = T->Right;//转向右子树 }}
中序非递归
void InOrder(BinTree *BT){ BinTree *T; Stack *S = CreateStack(); T = BT; while(T || !IsEmpty(S) ){ while(T){ ////一直向左并将沿途结点压入堆栈 Push(S,T); T = T->Left; } T = Pop(S); //结点弹出堆栈 printf("%d",T->Data);//打印结点 T = T->Right;//转向右子树 }}
递归后中前
void PostOrderTraversal(BinTree *BT){ if(BT){ PostOrderTraversal(BT->Left); PostOrderTraversal(BT->Right); printf("%d",BT->Data); }}void InOrderTraversal(BinTree *BT){ if(BT){ InOrderTraversal(BT->Left); printf("%d",BT->Data); InOrderTraversal(BT->Right); }}void PreOrderTraversal(BinTree *BT){ if(BT){ printf("%d",BT->Data); PreOrderTraversal(BT->Left); PreOrderTraversal(BT->Right); }}
二叉搜索树
按值查找
//递归BinTree* Find(ElementType X, BinTree* BST){ if(!BST) return NULL; //查找失败 if(X > BST->Data) return Find(X , BST->Right); else if(X < BST->Data) return Find(X, BST->Left); else return BST;}//迭代BinTree* iterFind( ElementType X, BinTree* BST){ while(BST) { if(X > BST->Data) BST=BST->Right; else if(X < BST->Data) BST=BST->Left; else return BST; } return NULL;}
查找最小
BinTree* FindMin( BinTree* BST){ if(BST) while(BST->Left) BST=BST->Left; return BST;}BinTree* FindMin( BinTree* BST){ if(!BST) return NULL; else if(!BST->Left) return BST; else return FindMin(BST->Left);}
查找最大
BinTree* FindMax( BinTree* BST){ if(BST) while(BST->Right) BST=BST->Right; return BST;}BinTree* FindMax( BinTree* BST){ if(!BST) return NULL; else if(!BST->Right) return BST; else return FindMin(BST->Right);}
插入
BinTree* Insert( ElementType X ,BinTree* BST){ if(!BST){ BST = (BinTree*)malloc(sizeof(BinTree)); BST->Data = X; BST->Left = BST->Right = NULL; }else{ if(X < BST->Data) BST->Left = Insert(X,BST->Left); else if(X > BST->Data) BST->Right = Insert(X,BST->Right); } return BST;}
删除
BinTree* Delete(ElementType X, BinTree *BST){ BinTree* tmp; if(!BST) printf("No Found"); else if(X < BST->Data) BST->Left = Delete(X,BST->Left); //左子树递归删除 else if(X > BST->Data) BST->Right = Delete(X,BST->Right); //右子树递归删除 else if(BST->Left && BST->Right){ //左右节点都存在 tmp = FindMin(BST->Right); //先找到右边最小 或者左边最大 BST->Data = tmp->Data; BST->Right = Delete(BST->Data,BST->Right); //删除那个元素 }else{ //被删除的结点有一个或没有子结点 tmp = BST; if(!BST->Left) BST = BST->Right; else if(!BST->Right) BST = BST->Left; free(tmp); } return BST;}
平衡二叉树
实现结构
typedef struct AVLTreeNode{ ElementType Data; struct AVLTreeNode* Left; struct AVLTreeNode* Right; int Height;}AVLTree;
插入以及调整函数
AVLTree* AVL_insertion(ElementType X ,AVLTree* T) //AVL树插入AVLTree* SingleLeftRotation(AVLTree* A); //左单旋AVLTree* DoubleLeftRightRotation(AVLTree* A);//左右双旋AVLTree* SingleRightRotationRotation(AVLTree* A);//右单选AVLTree* DoubleRightLeftRotation(AVLTree* A);//右左双旋AVLTree* DoubleRightLeftRotation(AVLTree* A){ A->Right = SingleLeftRotation(A->Right); return SingleRightRotation(A);}AVLTree* SingleRightRotation(AVLTree* A){ AVLTree* B = A->Right; A->Right = B->Left; B->Left = A; A->Height = Max(GetHeight(A->Left) , GetHeight(A->Right) ) + 1; B->Height = MAX(GetHeight(B->Left), GetHeight(B->Right)) + 1; return B;}AVLTree* DoubleLeftRightRotation(AVLTree* A){ A->Left = SingleRightRotation(A->Left); return SingleLeftRotation(A);}AVLTree* SingleLeftRotation(AVLTree* A){ AVLTree* B = A->Left; A->Left = B->Right; B->Right = A; A->Height = Max(GetHeight(A->Left) , GetHeight(A->Right) ) + 1; B->Height = MAX(GetHeight(B->Left), A->Height) + 1; return B;}AVLTree* AVL_insertion(ElementType X ,AVLTree* T){ if(!T){ //如果插入的是空树 T = (AVLTree*)malloc(sizeof(AVLTree)); T->Data = X; T->Height = 0; T->Left = T->Right = NULL; }else if(X < T->Data){ T->Left = AVL_insertion(X,T->Left); if(GetHeight(T->Left) - GetHeight(T->Right) == 2) //需要左旋 if(X < T->Left->Data) T = SingleLeftRotation(T); //左单旋 else T = DoubleLeftRightRotation(T); //左右双旋 }else if(X > T->Data){ T->Right = AVL_insertion(X,T->Left); if(GetHeight(T->Left) - GetHeight(T->Right) == -2) //需要右旋 if(X < T->Left->Data) T = SingleRightRotation(T); //右单旋 else T = DoubleRightLeftRotation(T);//右左双旋 } //else X == T->Data , 无需插入 T->Height = Max(GetHeight(T->Left) , GetHeight(T->Right) ) + 1; //更新高度 return T;}
最大堆
实现结构
typedef struct Heap{ ElementType *Elements; int Size; int Capacity;}MaxHeap;
创建
MaxHeap* Create(int MaxSize){ MaxHeap *H = (MaxHeap)malloc(sizeof(MaxHeap)); H->Elements = (ElementType*)malloc( (MaxSize + 1) * sizeof(ElementType) ); H->Size = 0; H->Capacity = MaxSize; H->Elements[0] = MaxData; // 哨兵 :大于堆中所有元素 return H;}
插入
void Insert(MaxHeap H,ElementType item){ int i; if(IsFull(H)){ printf("最大堆满"); return; } i = ++H->Size; for(;H->Elements[i / 2] < item ; i /= 2) H->Elements[i] = E->Elements[i / 2]; H->Elements[i] = item;}
删除
Elements DeleteMax(MaxHeap *H){ int Parent,Child; ElementType MaxItem,tmp; if(IsEmpty(H)){ printf("最大堆空") return; } MaxItem = H->Elements[1]; tmp = H->Elements[H->Size --]; for(Parent = 1 ; Parent * 2 <= H->Size ; Parent = Child){ Child = Parent * 2; if( (Child != H->Size) && (H->Elements[Child] < H->Elements[Child + 1]) ) //第一个判断是否有右儿子 Child ++; if(tmp >= H->Elements[Child]) break; else //移动到下一层 H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = tmp; return MaxItem;}
建立
MaxHeap* BuildMaxHeap(MaxHeap *H){ //调整H中的元素,使有序 int Parent,Child,i; ElementType tmp; for( i = H->Size / 2 ; i > 0 ; i --){ //从最后一个结点的父结点开始 tmp = H->Elements[i]; for(Parent = i ; Parent * 2 <= H->Size ; Parent = Child){ Child = Parent * 2; if( (Child != H->Size) && (H->Elements[Child] < H->Elements[Child + 1 ])) Child ++; if(tmp >= H->Elements[Child] ) break; else H->Elements[Parent] = H->Elements[Child]; }//内部for循环对以H->Elements[i]为根的子树调整 H->Elements[Parent] = tmp; } return H;}
哈夫曼树和集合
哈夫曼树结构及建立
typedef struct TreeNode{ int Weight; struct TreeNode *Left; struct TreeNode *Right;}HuffmanTree;HuffmanTree* Huffman(MinHeap H){ int i; HuffmanTree * T; BuildMinHeap(H); for(i = 1 ; i < H->Size ; i ++){ T = (HuffmanTree*)malloc(sizeof(HuffmanTree)); T->Left = DeleteMin(H); T->Right = DeleteMin(H); T->Weight = T->Left->Weight + T->Right->Weight; Insert(H,T); } T = DeleteMin(H); return T;}
集合结构以及查找合并函数
int Find(SetType *S ,ElementType X);//在数组S中查找元素X,返回X元素的树根结点在S中的下标void Union(SetType *S,ElementType X1,ElementType X2);//实现元素合并void Union(SetType *S,ElementType X1,ElementType X2){ int Root1,Root2; Root1 = Find(S,X1); Root2 = Find(S,X2); if( Roo1 != Root2) S[Root2].Parent = Root1;}int Find(SetType *S ,ElementType X){ for(i = 0 ; i < MaxSize && S[i].Data != X ; i ++); if(i > MaxSize) return -1; for(;S[i].Parent >= 0 ; i = S[i].Parent); return i;}
1 0
- 二叉树 c实现
- AVL树C实现
- AVL树C实现
- 树-C实现
- AVL树C实现
- AVL树-C实现
- 二叉树 C实现
- avl树 C实现
- 二叉树 c 实现
- 二叉树数组实现[C/C++]代码
- AVL树的实现(C语言实现)
- C语言实现树结构
- 败者树的实现(c++)
- B树C语言实现
- B树的C实现
- 【二叉查找树】c实现
- B树的C实现
- 用c实现二叉树
- 长期在后台定时运行的服务 第一行代码
- QPixmap与QImage的相互转化
- [学习笔记]html5基础--分组元素
- 并查集的基本操作模版
- 高斯混合模型 + 高斯分布回顾
- 树-C实现
- jsp跳转servlet,servlet跳转jsp,servlet跳转servlet的路径问题
- java回调机制的理解
- 如何给两个数组求交集
- 单源最短路-Dijkstra算法 (poj 1502)
- 【LEETCODE】234-Palindrome Linked List
- mysql 语法结构
- Linux常用命令大全
- NYOJ 171-聪明的kk