二叉树
#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;
}
else
return FindMin(T->left);
}
position FindMax(SearchTree T){
if(T==NULL){
return NULL;
}
else if(T->right==NULL){
return T;
}
else
return 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);
}
}