二叉樹應用
阿新 • • 發佈:2018-12-05
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define MAXSIZE 50 #define OVERFLOW -1 typedef int Status; typedef char TElemType; char m; typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; Status InitBiTree(BiTree &T) //構造空二叉樹T { T=NULL; return OK; } void DestroyBiTree(BiTree &T) //後序銷燬二叉樹T { if(T) { if(T->lchild) DestroyBiTree(T->lchild); if(T->rchild) DestroyBiTree(T->rchild); free(T); T=NULL; } } void CreateBiTree(BiTree &T) //先序建立二叉樹 { TElemType ch; scanf("%c",&ch); if(ch==' ') T=NULL; else { T=(BiTNode *)malloc(sizeof(BiTNode)); if(!T) exit(OVERFLOW); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } void PreOrderTraverse(BiTree T) // 先序遍歷遞迴 { if(T) { printf("%c ",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } void InOrderTraverse(BiTree T) // 中序遍歷遞迴 { if(T) { InOrderTraverse(T->lchild); printf("%c ",T->data); InOrderTraverse(T->rchild); } } void PostOrderTraverse(BiTree T) // 後序遍歷遞迴 { if(T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c ",T->data); } } // 中序遍歷非遞迴遍歷演算法 void InOrderTraversal_NoRecursion( BiTNode *T ) { BiTNode *Stack[MAXSIZE]; int top=-1; while(T || (top!=-1)) // T為空指標或者棧為空時終止。棧中不壓入空指標。 { while(T) // 一直向左並將沿途結點壓入堆疊 { Stack[++top] = T; T=T->lchild; } if(top!=-1) { T=Stack[top--]; // 結點彈出堆疊 printf("%c ",T->data); //(訪問)列印結點 T=T->rchild; // 轉向右子樹 } } } void find(BiTree T) { if(T) { if(T->data==m) { if(T->lchild==NULL && T->rchild==NULL) printf("沒有左右孩子\n"); else if(T->lchild==NULL && T->rchild!=NULL) printf("沒有左孩子 右孩子 %c \n",T->rchild->data); else if(T->lchild!=NULL && T->rchild==NULL) printf("左孩子%c 沒有右孩子\n",T->lchild->data); else { printf("左孩子 %c ",T->lchild->data); printf("右孩子 %c \n",T->rchild->data); } } find(T->lchild); find(T->rchild); } } void PreOrdershow(BiTree T) // 先序遍歷廣義表輸出 { if(T) { if(T->lchild==NULL && T->rchild==NULL) { printf("%c",T->data); return; } if(T->lchild!=NULL || T->rchild!=NULL) { printf("%c(",T->data); } if(T->lchild==NULL && T->rchild==NULL) { printf("%c",T->data); } PreOrdershow(T->lchild); if(T->rchild!=NULL) { printf(","); } PreOrdershow(T->rchild); if(T->lchild!=NULL || T->rchild!=NULL) { printf(")"); } } } void PreOrdershow1(BiTree T) //先序遍歷廣義表輸出 高階寫法 又上一個總結到這個 { if(T) { printf("%c",T->data); if(T->lchild!=NULL || T->rchild!=NULL) { printf("("); DispBTree(T->lchild); if(T->rchild!=NULL) printf(","); DispBTree(T->rchild); printf(")"); } } } int max(int a, int b) { return a>=b ? a : b; } int BTree_Height(BiTree T) //高度 { if(T==NULL) return 0; else if(T->lchild==NULL && T->rchild==NULL) return 1; else return 1+max(BTree_Height(T->lchild),BTree_Height(T->rchild)); } void PreOrderPrintLeaves(BiTree T) // 輸出葉子結點值 { if(T) { if(T->lchild==NULL && T->rchild==NULL) printf("%c ",T->data ); PreOrderPrintLeaves (T->lchild); PreOrderPrintLeaves (T->rchild); } } int main() { BiTree root; printf("建立二叉樹\n"); InitBiTree(root); CreateBiTree(root); printf("\n"); printf("輸出二叉樹\n");//"ABD EHJ KL M N CF G I " PreOrdershow(root);printf("\n"); PreOrdershow1(root); printf("\n\n"); printf("查詢H節點\n"); m='H'; find(root); printf("\n\n"); printf("二叉樹高度\n"); printf("%d",BTree_Height(root)); printf("\n\n"); printf("釋放二叉樹\n"); DestroyBiTree(root); }
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define MAXSIZE 50 #define OVERFLOW -1 typedef int Status; typedef char TElemType; char m; typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; Status InitBiTree(BiTree &T) //構造空二叉樹T { T=NULL; return OK; } void DestroyBiTree(BiTree &T) //後序銷燬二叉樹T { if(T) { if(T->lchild) DestroyBiTree(T->lchild); if(T->rchild) DestroyBiTree(T->rchild); free(T); T=NULL; } } void CreateBiTree(BiTree &T) //先序建立二叉樹 { TElemType ch; scanf("%c",&ch); if(ch==' ') T=NULL; else { T=(BiTNode *)malloc(sizeof(BiTNode)); if(!T) exit(OVERFLOW); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } void PreOrderTraverse(BiTree T) // 先序遍歷遞迴 { if(T) { printf("%c ",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } void InOrderTraverse(BiTree T) // 中序遍歷遞迴 { if(T) { InOrderTraverse(T->lchild); printf("%c ",T->data); InOrderTraverse(T->rchild); } } void PostOrderTraverse(BiTree T) // 後序遍歷遞迴 { if(T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c ",T->data); } } void PreOrderTraverse_NoRecursion(BiTNode *T) // 先序遍歷非遞迴遍歷演算法 { BiTNode *Stack[MAXSIZE]; int top=-1; while(T || (top!=-1)) { while(T) { Stack[++top]=T; printf("%c ",T->data); T=T->lchild; } if(top!=-1) { T=Stack[top--]; T=T->rchild; } } } void InOrderTraversal_NoRecursion(BiTNode *T) // 中序遍歷非遞迴遍歷演算法 { BiTNode *Stack[MAXSIZE]; int top=-1; while(T || (top!=-1)) // T為空指標或者棧為空時終止。棧中不壓入空指標。 { while(T) // 一直向左並將沿途結點壓入堆疊 { Stack[++top]=T; T=T->lchild; } if(top!=-1) { T=Stack[top--]; // 結點彈出堆疊 printf("%c ",T->data); //(訪問)列印結點 T=T->rchild; // 轉向右子樹 } } } void PostOrderTraversal_NoRecursion(BiTNode *T) // 後序遍歷非遞迴遍歷演算法 { BiTNode *Stack[MAXSIZE]; int Stack1[MAXSIZE]; int top=-1;int tag; while(T || (top!=-1)) { while(T) { Stack[++top]=T; tag=0; Stack1[top]=tag; T=T->lchild; } if(Stack1[top]==0) { tag=1; Stack1[top]=tag; T=Stack[top]->rchild; } else { T=Stack[top]; top--; printf("%c ",T->data); T=NULL; } } } void LevelorderTraverse(BiTNode *T) { BiTNode *Queue[MAXSIZE]; int front=0,rear=0; if(T) { Queue[++rear]=T; /* 根結點入隊 */ while(front<rear) { T=Queue[++front]; printf("%c ",T->data); if(T->lchild!=NULL) Queue[++rear]=T->lchild; /* 左結點入隊 */ if(T->rchild!=NULL) Queue[++rear]=T->rchild; /* 右結點入隊 */ } } } void find(BiTree T) { if(T) { if(T->data==m) { if(T->lchild==NULL && T->rchild==NULL) printf("沒有左右孩子\n"); else if(T->lchild==NULL && T->rchild!=NULL) printf("沒有左孩子 右孩子 %c \n",T->rchild->data); else if(T->lchild!=NULL && T->rchild==NULL) printf("左孩子%c 沒有右孩子\n",T->lchild->data); else { printf("左孩子 %c ",T->lchild->data); printf("右孩子 %c \n",T->rchild->data); } } find(T->lchild); find(T->rchild); } } void PreOrdershow(BiTree T) // 先序遍歷廣義表輸出 { if(T) { if(T->lchild==NULL && T->rchild==NULL) { printf("%c",T->data); return; } if(T->lchild!=NULL || T->rchild!=NULL) { printf("%c(",T->data); } if(T->lchild==NULL && T->rchild==NULL) { printf("%c",T->data); } PreOrdershow(T->lchild); if(T->rchild!=NULL) { printf(","); } PreOrdershow(T->rchild); if(T->lchild!=NULL || T->rchild!=NULL) { printf(")"); } } } int max(int a, int b) { return a>=b ? a : b; } int BTree_Height(BiTree T) //高度 { if(T==NULL) return 0; else if(T->lchild==NULL && T->rchild==NULL) return 1; else return 1+max(BTree_Height(T->lchild),BTree_Height(T->rchild)); } void PreOrderPrintLeaves(BiTree T) // 輸出葉子結點值 { if(T) { if(T->lchild==NULL && T->rchild==NULL) printf("%c ",T->data ); PreOrderPrintLeaves (T->lchild); PreOrderPrintLeaves (T->rchild); } } int main() { BiTree root; printf("建立二叉樹\n"); InitBiTree(root); CreateBiTree(root); printf("輸出二叉樹\n");//"ABD EHJ KL M N CF G I " PreOrdershow(root); printf("\n"); printf("層次遍歷二叉樹-遞迴\n"); LevelorderTraverse(root); printf("\n"); printf("先序遍歷二叉樹-遞迴\n"); PreOrderTraverse(root); printf("\n"); printf("先序遍歷二叉樹-非遞迴\n"); PreOrderTraverse_NoRecursion(root); printf("\n"); printf("中序遍歷二叉樹-遞迴\n"); InOrderTraverse(root); printf("\n"); printf("中序遍歷二叉樹-非遞迴\n"); InOrderTraversal_NoRecursion(root); printf("\n"); printf("後序遍歷二叉樹-遞迴\n"); PostOrderTraverse(root); printf("\n"); printf("後序遍歷二叉樹-非遞迴\n"); PostOrderTraversal_NoRecursion(root); printf("\n"); printf("釋放二叉樹\n"); DestroyBiTree(root); printf("\n"); }
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define MAXSIZE 50 #define OVERFLOW -1 typedef int Status; typedef char TElemType; int level; char m; typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; Status InitBiTree(BiTree &T) //構造空二叉樹T { T=NULL; return OK; } void DestroyBiTree(BiTree &T) //後序銷燬二叉樹T { if(T) { if(T->lchild) DestroyBiTree(T->lchild); if(T->rchild) DestroyBiTree(T->rchild); free(T); T=NULL; } } void CreateBiTree(BiTree &T) //先序建立二叉樹 { TElemType ch; scanf("%c",&ch); if(ch==' ') T=NULL; else { T=(BiTNode *)malloc(sizeof(BiTNode)); if(!T) exit(OVERFLOW); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } void PreOrderTraverse(BiTree T) // 先序遍歷遞迴 { if(T) { printf("%c ",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } void InOrderTraverse(BiTree T) // 中序遍歷遞迴 { if(T) { InOrderTraverse(T->lchild); printf("%c ",T->data); InOrderTraverse(T->rchild); } } void PostOrderTraverse(BiTree T) // 後序遍歷遞迴 { if(T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c ",T->data); } } void PreOrderTraverse_NoRecursion(BiTNode *T) // 先序遍歷非遞迴遍歷演算法 { BiTNode *Stack[MAXSIZE]; int top=-1; while(T || (top!=-1)) { while(T) { Stack[++top]=T; printf("%c ",T->data); T=T->lchild; } if(top!=-1) { T=Stack[top--]; T=T->rchild; } } } void InOrderTraversal_NoRecursion(BiTNode *T) // 中序遍歷非遞迴遍歷演算法 { BiTNode *Stack[MAXSIZE]; int top=-1; while(T || (top!=-1)) // T為空指標或者棧為空時終止。棧中不壓入空指標。 { while(T) // 一直向左並將沿途結點壓入堆疊 { Stack[++top]=T; T=T->lchild; } if(top!=-1) { T=Stack[top--]; // 結點彈出堆疊 printf("%c ",T->data); //(訪問)列印結點 T=T->rchild; // 轉向右子樹 } } } void PostOrderTraversal_NoRecursion(BiTNode *T) // 後序遍歷非遞迴遍歷演算法 { BiTNode *Stack[MAXSIZE]; int Stack1[MAXSIZE]; int top=-1;int tag; while(T || (top!=-1)) { while(T) { Stack[++top]=T; tag=0; Stack1[top]=tag; T=T->lchild; } if(Stack1[top]==0) { tag=1; Stack1[top]=tag; T=Stack[top]->rchild; } else { T=Stack[top]; top--; printf("%c ",T->data); T=NULL; } } } void LevelorderTraverse(BiTNode *T) { BiTNode *Queue[MAXSIZE]; int front=0,rear=0; if(T) { Queue[++rear]=T; /* 根結點入隊 */ while(front<rear) { T=Queue[++front]; printf("%c ",T->data); if(T->lchild!=NULL) Queue[++rear]=T->lchild; /* 左結點入隊 */ if(T->rchild!=NULL) Queue[++rear]=T->rchild; /* 右結點入隊 */ } } } void find_address(BiTree &T) //"ABD EHJ KL M N CF G I " { if(T) { if(T->data==m) { if(T->lchild==NULL && T->rchild==NULL) printf("沒有左右孩子"); else if(T->lchild==NULL && T->rchild!=NULL) printf("沒有左孩子 右孩子 %c ",T->rchild->data); else if(T->lchild!=NULL && T->rchild==NULL) printf("左孩子%c 沒有右孩子",T->lchild->data); else { printf("左孩子 %c ",T->lchild->data); printf("右孩子 %c ",T->rchild->data); } printf(" 查詢節點所在層次%d \n",level); } level++; find_address(T->lchild); find_address(T->rchild); level--; } } void PreOrdershow(BiTree T) // 先序遍歷廣義表輸出 { if(T) { if(T->lchild==NULL && T->rchild==NULL) { printf("%c",T->data); return; } if(T->lchild!=NULL || T->rchild!=NULL) { printf("%c(",T->data); } if(T->lchild==NULL && T->rchild==NULL) { printf("%c",T->data); } PreOrdershow(T->lchild); if(T->rchild!=NULL) { printf(","); } PreOrdershow(T->rchild); if(T->lchild!=NULL || T->rchild!=NULL) { printf(")"); } } } int max(int a, int b) { return a>=b ? a:b; } int BTree_Height(BiTree T) //高度 { if(T==NULL) return 0; else if(T->lchild==NULL && T->rchild==NULL) return 1; else return 1+max(BTree_Height(T->lchild),BTree_Height(T->rchild)); } void PreOrderPrintLeaves(BiTree T) // 輸出葉子結點值 { if(T) { if(T->lchild==NULL && T->rchild==NULL) printf("%c ",T->data ); PreOrderPrintLeaves (T->lchild); PreOrderPrintLeaves (T->rchild); } } int main() { BiTree root; printf("建立二叉樹\n"); InitBiTree(root); CreateBiTree(root); printf("\n"); printf("輸出二叉樹\n");//"ABD EHJ KL M N CF G I " PreOrdershow(root); printf("\n\n"); printf("查詢定位\n"); m='G'; find_address(root); printf("\n\n"); printf("釋放二叉樹\n"); DestroyBiTree(root); printf("\n"); }
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 50
#define OVERFLOW -1
typedef int Status;
typedef char TElemType;
char m;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
Status InitBiTree(BiTree &T) //構造空二叉樹T
{
T=NULL;
return OK;
}
void DestroyBiTree(BiTree &T) //後序銷燬二叉樹T
{
if(T)
{
if(T->lchild) DestroyBiTree(T->lchild);
if(T->rchild) DestroyBiTree(T->rchild);
free(T);
T=NULL;
}
}
void CreateBiTree(BiTree &T) //先序建立二叉樹
{
TElemType ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
if(!T) exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrderTraverse(BiTree T) // 先序遍歷遞迴
{
if(T)
{
printf("%c ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T) // 中序遍歷遞迴
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c ",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T) // 後序遍歷遞迴
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ",T->data);
}
}
// 中序遍歷非遞迴遍歷演算法
void InOrderTraversal_NoRecursion( BiTNode *T )
{
BiTNode *Stack[MAXSIZE];
int top=-1;
while(T || (top!=-1)) // T為空指標或者棧為空時終止。棧中不壓入空指標。
{
while(T) // 一直向左並將沿途結點壓入堆疊
{
Stack[++top] = T;
T=T->lchild;
}
if(top!=-1)
{
T=Stack[top--]; // 結點彈出堆疊
printf("%c ",T->data); //(訪問)列印結點
T=T->rchild; // 轉向右子樹
}
}
}
void find(BiTree T)
{
if(T)
{
if(T->data==m)
{
if(T->lchild==NULL && T->rchild==NULL) printf("沒有左右孩子\n");
else if(T->lchild==NULL && T->rchild!=NULL) printf("沒有左孩子 右孩子 %c \n",T->rchild->data);
else if(T->lchild!=NULL && T->rchild==NULL) printf("左孩子%c 沒有右孩子\n",T->lchild->data);
else
{
printf("左孩子 %c ",T->lchild->data);
printf("右孩子 %c \n",T->rchild->data);
}
}
find(T->lchild);
find(T->rchild);
}
}
void PreOrdershow(BiTree T) // 先序遍歷廣義表輸出
{
if(T)
{
if(T->lchild==NULL && T->rchild==NULL)
{
printf("%c",T->data);
return;
}
if(T->lchild!=NULL || T->rchild!=NULL)
{
printf("%c(",T->data);
}
if(T->lchild==NULL && T->rchild==NULL)
{
printf("%c",T->data);
}
PreOrdershow(T->lchild);
if(T->rchild!=NULL)
{
printf(",");
}
PreOrdershow(T->rchild);
if(T->lchild!=NULL || T->rchild!=NULL)
{
printf(")");
}
}
}
int max(int a, int b)
{
return a>=b ? a : b;
}
int BTree_Height(BiTree T) //高度
{
if(T==NULL)
return 0;
else
if(T->lchild==NULL && T->rchild==NULL)
return 1;
else
return 1+max(BTree_Height(T->lchild),BTree_Height(T->rchild));
}
int PrintAncestors(BiTree root, char x) //查詢x並輸逆序出x的祖先
{
if (!root) return 0;
if (root->data==x)
{
printf("%c ",root->data);
return 1;
}
//如果子樹中可以找到匹配值 那麼此節點肯定是祖先結點
if (PrintAncestors(root->lchild, x) || PrintAncestors(root->rchild, x))
{
printf("%c ", root->data);
return 1;
}
return 0;
}//列印祖先
void LeavestoGra(BiTree T,TElemType path[],int len) //所有葉子節點到根節點的逆序列 (先序遍歷
{
if(T!=NULL)
{
if(T->lchild==NULL && T->rchild==NULL) //輸出棧中所有結點
{
printf("%c->",T->data);
for(int i=len-1;i>0;i--)
printf("%c->",path[i]);
printf("%c\n",path[0]);
}
else
{ path[len++]=T->data;
LeavestoGra(T->lchild,path,len);
LeavestoGra(T->rchild,path,len);
}
}
}
void MaxPath(BiTree T,TElemType path[],int len,TElemType maxpath[],int &maxlen)
{
if(T!=NULL)
{
if(T->lchild==NULL && T->rchild==NULL) //輸出棧中所有結點值
{
if(len>maxlen) //通過比較求最長路徑
{
maxpath[len]=T->data;
for(int i=len-1;i>=0;i--)
maxpath[i]=path[i];
maxlen=len+1;
}
}
else
{
path[len++]=T->data; //將當前節點放入路徑中 //路徑長度增1
MaxPath(T->lchild,path,len,maxpath,maxlen);
MaxPath(T->rchild,path,len,maxpath,maxlen);
}
}
}
void zhenghe(BiTree T,TElemType path[],int len,TElemType maxpath[],int &maxlen) //全部輸出與最長路徑整合
{
if(T!=NULL)
{
if(T->lchild==NULL && T->rchild==NULL) //輸出棧中所有結點值
{
printf("%c->",T->data);
for(int i=len-1;i>0;i--)
printf("%c->",path[i]);
printf("%c\n",path[0]);
if(len>maxlen) //通過比較求最長路徑
{
maxpath[len]=T->data;
for(int i=len-1;i>=0;i--)
maxpath[i]=path[i];
maxlen=len+1;
}
}
else
{
path[len++]=T->data; //將當前節點放入路徑中 //路徑長度增1
zhenghe(T->lchild,path,len,maxpath,maxlen);
zhenghe(T->rchild,path,len,maxpath,maxlen);
}
}
}
void PreOrderPrintLeaves(BiTree T) // 輸出葉子結點值
{
if(T)
{
if(T->lchild==NULL && T->rchild==NULL)
printf("%c ",T->data );
PreOrderPrintLeaves (T->lchild);
PreOrderPrintLeaves (T->rchild);
}
}
int main()
{
BiTree root;
printf("建立二叉樹\n");
InitBiTree(root);
CreateBiTree(root);
printf("\n");
printf("輸出二叉樹\n");//"ABD EHJ KL M N CF G I "
PreOrdershow(root);
printf("\n\n");
/*
printf("葉子結點逆序\n");
TElemType path[MAXSIZE];
LeavestoGra(root,path,0);
printf("\n");
printf("第一條最長逆路徑長度:");
TElemType maxpath[MAXSIZE];int maxlen=0;
MaxPath(root,path,0,maxpath,maxlen);
printf("%d\n",maxlen);
printf("第一條最長逆路徑:");
for(int j=maxlen;j>=0;j--)
printf("%c ",maxpath[j]);
printf("\n\n");
*/
//全部輸出與最長路徑整合
printf("葉子結點逆序\n");
TElemType path[MAXSIZE];TElemType maxpath[MAXSIZE];int maxlen=0;
zhenghe(root,path,0,maxpath,maxlen);
printf("\n");
printf("第一條最長逆路徑長度:");
printf("%d\n",maxlen);
printf("第一條最長逆路徑:");
for(int j=maxlen;j>=0;j--)
printf("%c ",maxpath[j]);
printf("\n\n");
printf("釋放二叉樹\n");
DestroyBiTree(root);
}