生活随笔
收集整理的這篇文章主要介紹了
Linux C 算法与数据结构 --二叉树
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
頭文件BiTree.h
[cpp]?view plaincopy
typedef?int?Item;?? typedef?struct?node?? {?? ????struct?node?*?lchild;?? ????struct?node?*?rchild;?? ????Item?data;?? }BiTNode,*BiTree;?? ?? ?? BiTree?InitBiTree(BiTNode?*root);?? ?? ?? BiTNode?*MakeNode(Item?item,BiTNode?*lchild,BiTNode?*rchild);?? ?? void?FreeNode(BiTNode?*pnode);?? ?? ?? void?ClearBiTree(BiTree?tree);?? ?? ?? void?DestroyBiTree(BiTree?tree);?? ?? ?? IsEmpty(BiTree?tree);?? ?? ?? GetDepth(BiTree?tree);?? ?? ?? BiTree?GetRoot(BiTree?tree);?? ?? ?? Item?GetItem(BiTNode?*pnode);?? ?? ?? void?SetItem(BiTNode?*pnode,Item?item);?? ?? ?? BiTree?SetLChild(BiTree?parent,BiTree?lchild);?? ?? ?? BiTree?SetRChild(BiTree?parent,BiTree?rchild);?? ?? ?? BiTree?GetLChild(BiTree?tree);?? ?? ?? BiTree?GetRChild(BiTree?tree);?? ?? ?? BiTree?InsertChild(BiTree?parent,int?lr,BiTree?child);?? ?? ?? void?DeleteChild(BiTree?parent,int?lr);?? ?? ?? PreOrderTraverse(BiTree?tree,void(*visit)());?? ?? ?? InOrderTraverse(BiTree?tree,void(*visit)());?? ?? ?? PostOrderTraverse(BiTree?tree,void(*visit)());??
實現(xiàn)文件BiTree.c
[cpp]?view plaincopy
#include"BiTree.h"?? #include<malloc.h>?? #include<stdlib.h>?? ?? ?? BiTree?InitBiTree(BiTNode?*root)?? {?? ????BiTree?tree?=?root;?? ????return?tree;?? }?? ?? ?? BiTNode?*MakeNode(Item?item,BiTNode?*lchild,BiTNode?*rchild)?? {?? ????BiTNode?*?pnode?=?(BiTNode?*)malloc(sizeof(BiTNode));?? ????if(pnode)?? ????{?? ????????pnode->data?=?item;?? ????????pnode->lchild?=?lchild;?? ????????pnode->rchild?=?rchild;?? ????}?? ????return?pnode;?????? }?? ?? ?? void?FreeNode(BiTNode?*pnode)?? {?? ????if(pnode!=NULL)?? ????????free(pnode);?? }?? ?? ?? void?ClearBiTree(BiTree?tree)?? {?? ????BiTNode?*?pnode?=?tree;?? ????if(pnode->lchild!=NULL)?? ????????ClearBiTree(pnode->lchild);?? ?? ????if(pnode->rchild!=NULL)?? ????????ClearBiTree(pnode->rchild);?? ?? ????FreeNode(pnode);?? }?? ?? ?? void?DestroyBiTree(BiTree?tree)?? {?? ????if(tree)?? ????????ClearBiTree(tree);?????? }?? ?? ?? IsEmpty(BiTree?tree)?? {?? ????if(tree==NULL)?? ????????return?0;?? ????else?? ????????return?1;?? }?? ?? ?? int?GetDepth(BiTree?tree)?? {?? ????int?cd,ld,rd;?? ????cd?=?ld?=?rd?=?0;?? ????if(tree)?? ????{?? ????????ld?=?GetDepth(tree->lchild);?? ????????rd?=?GetDepth(tree->rchild);?? ????????cd?=?(ld?>?rd???ld?:?rd);?? ????????return?cd+1;?? ????}?? ????else?? ????????return?0;?? }?? ?? ?? BiTree?GetRoot(BiTree?tree)?? {?? ????return?tree;?? }?? ?? ?? Item?GetItem(BiTNode?*pnode)?? {?? ????return?pnode->data;?? }?? ?? ?? void?SetItem(BiTNode?*pnode,Item?item)?? {?? ????pnode->data?=?item;?? }?? ?? ?? BiTree?SetLChild(BiTree?parent,BiTree?lchild)?? {?? ????parent->lchild?=?lchild;?? ????return?lchild;?? }?? ?? ?? BiTree?SetRChild(BiTree?parent,BiTree?rchild)?? {?? ????parent->rchild?=?rchild;?? ????return?rchild;?? }?? ?? ?? BiTree?GetLChild(BiTree?tree)?? {?? ????if(tree)?? ????????return?tree->lchild;?? ????return?NULL;?? }?? ?? ?? BiTree?GetRChild(BiTree?tree)?? {?? ????if(tree)?? ????????return?tree->rchild;?? ????return?NULL;?? }?? ?? ?? BiTree?InsertChild(BiTree?parent,int?lr,BiTree?child)?? {?? ????if(parent)?? ????{?? ????????if(?lr?==?0?&&?parent->lchild?==?NULL)?? ????????{?? ????????????parent->lchild?=?child;?? ????????????return?child;?? ????????}?????? ????????if(?lr?==?1?&&?parent->rchild?==?NULL)?? ????????{?? ????????????parent->rchild?=?child;?? ????????????return?child;?? ????????}?????? ????}?? ????return?NULL;?????? }?? ?? ?? void?DeleteChild(BiTree?parent,int?lr)?? {?? ????if(parent)?? ????{?? ????????if(?lr?==?0?&&?parent->lchild?!=?NULL)?? ????????{?? ????????????parent->lchild?=?NULL;?? ????????????FreeNode(parent->lchild);?? ????????}?????? ????????if(?lr?==?1?&&?parent->rchild?!=?NULL)?? ????????{?? ????????????parent->rchild?=?NULL;?? ????????????FreeNode(parent->rchild);?? ????????}?????? ????}?? }?? ?? ?? PreOrderTraverse(BiTree?tree,void(*visit)())?? {?? ????BiTNode?*?pnode?=?tree;?? ????if(pnode)?? ????{?? ????????visit(pnode->data);?? ????????PreOrderTraverse(pnode->lchild,visit);?? ????????PreOrderTraverse(pnode->rchild,visit);?? ????}?? }?? ?? ?? InOrderTraverse(BiTree?tree,void(*visit)())?? {?? ????BiTNode?*?pnode?=?tree;?? ????if(pnode)?? ????{?? ????????InOrderTraverse(pnode->lchild,visit);?? ????????visit(pnode->data);?? ????????InOrderTraverse(pnode->rchild,visit);?? ????}?? }?? ?? ?? PostOrderTraverse(BiTree?tree,void(*visit)())?? {?? ????BiTNode?*?pnode?=?tree;?? ????if(pnode)?? ????{?? ????????PostOrderTraverse(pnode->lchild,visit);?????????? ????????PostOrderTraverse(pnode->rchild,visit);?? ????????visit(pnode->data);?? ????}?? }??
測試程序如下
[cpp]?view plaincopy
#include"BiTree.h"?? #include<stdio.h>?? void?print(Item?item)?? {?? ????printf("%d?",item);?? }?? main()?? {?????? ????BiTNode?*?n1?=?MakeNode(10,NULL,NULL);?? ????BiTNode?*?n2?=?MakeNode(20,NULL,NULL);?? ????BiTNode?*?n3?=?MakeNode(30,n1,n2);?? ????BiTNode?*?n4?=?MakeNode(40,NULL,NULL);?? ????BiTNode?*?n5?=?MakeNode(50,NULL,NULL);?? ????BiTNode?*?n6?=?MakeNode(60,n4,n5);?? ????BiTNode?*?n7?=?MakeNode(70,NULL,NULL);?? ?? ????BiTree?tree?=?InitBiTree(n7);?? ????SetLChild(tree,n3);?? ????SetRChild(tree,n6);?? ?? ????printf("樹的深度為:%d",GetDepth(tree));?? ?????? ????printf("\n先序遍歷如下:");?? ????PreOrderTraverse(tree,print);?? ?? ????printf("\n中序遍歷如下:");?? ????InOrderTraverse(tree,print);?? ?? ????printf("\n后序遍歷如下:");?? ????PostOrderTraverse(tree,print);?? ?? ????DeleteChild(tree,1);?? ????printf("\n后序遍歷如下:");?? ????PostOrderTraverse(tree,print);?? ?? ????DestroyBiTree(tree);?? ????if(IsEmpty(tree))?? ?????printf("\n二叉樹為空,銷毀完畢\n");?? }??
執(zhí)行結(jié)果如下:
[cpp]?view plaincopy
fs@ubuntu:~/qiang/tree$?./Test?? 樹的深度為:3?? 先序遍歷如下:70?30?10?20?60?40?50??? 中序遍歷如下:10?30?20?70?40?60?50??? 后序遍歷如下:10?20?30?40?50?60?70??? 二叉樹為空,銷毀完畢 ?
總結(jié)
以上是生活随笔為你收集整理的Linux C 算法与数据结构 --二叉树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。