二叉树
#include <stdio.h>
#include <stdlib.h>#define MAXNODE 100
typedef int ElementType;
typedef struct BinNode {ElementType Element;struct BinNode *lchild, *rchild;
} BinNode, *BinTree;
void PreOrder(BinTree T) {if (T) {printf("%c", T->Element);PreOrder(T->lchild);PreOrder(T->rchild);}
}
void InOrder(BinTree T) {if (T) {InOrder(T->lchild);printf("%c", T->Element);InOrder(T->rchild);}
}
void PostOrder(BinTree T) {if (T) {PostOrder(T->lchild);PostOrder(T->rchild);printf("%c", T->Element);}
}
void LevelOrder(BinTree T) {if (!T) return;BinTree queue[MAXNODE]; int front = 0, rear = 0;queue[rear++] = T;while (front < rear) {BinTree current = queue[front++];printf("%c", current->Element);if (current->lchild)queue[rear++] = current->lchild;if (current->rchild)queue[rear++] = current->rchild;}
}
BinTree CreateNode(ElementType value) {BinTree newNode = (BinTree)malloc(sizeof(BinNode));if (newNode == NULL) {printf("内存分配失败!\n");return NULL;}newNode->Element = value;newNode->lchild = NULL;newNode->rchild = NULL;return newNode;
}
BinTree CreateEmptyTree() {return NULL;
}
BinTree BuildTree() {char ch;scanf(" %c", &ch); if (ch == '#') { return NULL;} else {BinTree T = CreateNode(ch);printf("输入 %c 的左子树:", ch);T->lchild = BuildTree();printf("输入 %c 的右子树:", ch);T->rchild = BuildTree();return T;}
}
BinTree InsertNode(BinTree T, ElementType value) {if (T == NULL) {return CreateNode(value);}if (value < T->Element) {T->lchild = InsertNode(T->lchild, value);} else if (value > T->Element) {T->rchild = InsertNode(T->rchild, value);}return T;
}
BinTree FindNode(BinTree T, ElementType value) {if (T == NULL || T->Element == value) {return T;}if (value < T->Element) {return FindNode(T->lchild, value);} else {return FindNode(T->rchild, value);}
}
int GetHeight(BinTree T) {if (T == NULL) {return 0;}int leftHeight = GetHeight(T->lchild);int rightHeight = GetHeight(T->rchild);return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
int GetNodeCount(BinTree T) {if (T == NULL) {return 0;}return GetNodeCount(T->lchild) + GetNodeCount(T->rchild) + 1;
}
int GetLeafCount(BinTree T) {if (T == NULL) {return 0;}if (T->lchild == NULL && T->rchild == NULL) {return 1;}return GetLeafCount(T->lchild) + GetLeafCount(T->rchild);
}
int IsEmpty(BinTree T) {return T == NULL;
}
int IsComplete(BinTree T) {if (T == NULL) {return 1; }BinTree queue[MAXNODE];int front = 0, rear = 0;int flag = 0; queue[rear++] = T;while (front < rear) {BinTree current = queue[front++];if (current->lchild) {if (flag) return 0; queue[rear++] = current->lchild;} else {flag = 1; }if (current->rchild) {if (flag) return 0; queue[rear++] = current->rchild;} else {flag = 1; }}return 1;
}
int IsFull(BinTree T) {if (T == NULL) {return 1; }int height = GetHeight(T);int nodeCount = GetNodeCount(T);return nodeCount == (1 << height) - 1;
}
void DestroyTree(BinTree T) {if (T == NULL) {return;}DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);
}
BinTree CopyTree(BinTree T) {if (T == NULL) {return NULL;}BinTree newTree = CreateNode(T->Element);newTree->lchild = CopyTree(T->lchild);newTree->rchild = CopyTree(T->rchild);return newTree;
}
void MirrorTree(BinTree T) {if (T == NULL) {return;}BinTree temp = T->lchild;T->lchild = T->rchild;T->rchild = temp;MirrorTree(T->lchild);MirrorTree(T->rchild);
}
#include <stdio.h>
#include <stdlib.h>typedef int ElementType;typedef struct TreeNode
{ElementType data;struct TreeNode *left;struct TreeNode *right;
}*SearchTree,*position;
SearchTree Insert(ElementType x,SearchTree T){if(T==NULL){T=(SearchTree)malloc((sizeof(struct TreeNode)));T->data-x;T->left=NULL;T->right=NULL;}else if(x<T->data){T->left=Insert(x,T->data);}else if (x>T->data){T->right=Insert(x,T->right);}return T;
}
SearchTree CreatBST(SearchTree T,int a[],int n){int i;T=NULL;for(i=0;i<n;i++){Insert(a[i],T);}return T;
}
SearchTree MakeEmpty(SearchTree T){if(T!=NULL){MakeEmpty(T->left);MakeEmpty(T->right);free(T);}return NULL;
}
position Find(ElementType x,SearchTree T){if(T==NULL){return NULL;}if(x<T->data){return Find(x,T->left);}else if(x<T->data){return Find(x,T->right);}else{return T;}
}
position FindMin(SearchTree T){if (T==NULL){return NULL;}else if(T->left==NULL){return T;}elsereturn FindMin(T->left);
}
position FindMax(SearchTree T){if(T==NULL){return NULL;}else if(T->right==NULL){return T;}elsereturn FindMax(T->right);
}SearchTree Delete(ElementType x,SearchTree T){position Tmpcell;if(T==NULL){printf("Element Not Found!");}else if(x<T->data){T->left=Delete(x,T->left);}else if(x>T->data){T->right=Delete(x,T->right);}else{if(T->left && T->right){Tmpcell=FindMin(T->right);T->data=Tmpcell->data;T->right=Delete(T->data,T->right);}else{Tmpcell=T;if(T->left==NULL){T=T->right;}else if (T->right==NULL){T=T->left;}}free(Tmpcell);}return T;
}