二叉树
#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>
#include <limits.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->left);}else if (x>T->data){T->right=Insert(x,T->right);}return T;
}
SearchTree CreatBST(int a[],int n){SearchTree T = NULL;int i;for(i=0;i<n;i++){T = 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;
}
int IsEmpty(SearchTree T) {return T == NULL;
}
int Height(SearchTree T) {int leftHeight, rightHeight;if (T == NULL) {return -1; }leftHeight = Height(T->left);rightHeight = Height(T->right);return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
int CountNodes(SearchTree T) {if (T == NULL) {return 0;}return CountNodes(T->left) + CountNodes(T->right) + 1;
}
void InorderTraversal(SearchTree T) {if (T != NULL) {InorderTraversal(T->left);printf("%d ", T->data);InorderTraversal(T->right);}
}
void PreorderTraversal(SearchTree T) {if (T != NULL) {printf("%d ", T->data);PreorderTraversal(T->left);PreorderTraversal(T->right);}
}
void PostorderTraversal(SearchTree T) {if (T != NULL) {PostorderTraversal(T->left);PostorderTraversal(T->right);printf("%d ", T->data);}
}
int IsBSTUtil(SearchTree T, ElementType min, ElementType max);
int IsBST(SearchTree T) {return IsBSTUtil(T, INT_MIN, INT_MAX);
}
int IsBSTUtil(SearchTree T, ElementType min, ElementType max) {if (T == NULL) {return 1;}if (T->data < min || T->data > max) {return 0;}return IsBSTUtil(T->left, min, T->data - 1) && IsBSTUtil(T->right, T->data + 1, max);
}
position FindSuccessor(SearchTree T, ElementType x) {position current, successor, temp;current = Find(x, T);if (current == NULL) {return NULL;}if (current->right != NULL) {return FindMin(current->right);}successor = NULL;temp = T;while (temp != current) {if (current->data < temp->data) {successor = temp;temp = temp->left;} else {temp = temp->right;}}return successor;
}
position FindPredecessor(SearchTree T, ElementType x) {position current, predecessor, temp;current = Find(x, T);if (current == NULL) {return NULL;}if (current->left != NULL) {return FindMax(current->left);}predecessor = NULL;temp = T;while (temp != current) {if (current->data > temp->data) {predecessor = temp;temp = temp->right;} else {temp = temp->left;}}return predecessor;
}
void PrintTreeUtil(SearchTree T, int level);
void PrintTree(SearchTree T) {PrintTreeUtil(T, 0);
}
void PrintTreeUtil(SearchTree T, int level) {int i;if (T != NULL) {PrintTreeUtil(T->right, level + 1);for (i = 0; i < level; i++) {printf(" ");}printf("%d\n", T->data);PrintTreeUtil(T->left, level + 1);}
}