#pragma once ///////////// //////.h typedef char DataType; typedef struct BinTreeNode { struct BinTreeNode* _pLeft; struct BinTreeNode* _pRight; DataType _data; }Node,*PNode; PNode BuyBinTreeNode(DataType data); void _CreateBinTree(PNode *pRoot,DataType array[],int size,int *index,DataType invalid); void CreateBinTree(PNode *pRoot,DataType array[],int size,DataType invalid); PNode CopyBinTree(PNode pRoot); void PreTree(PNode pRoot); void InOrder(PNode pRoot); void PostOrder(PNode pRoot); void DestroyBinTree(PNode *pRoot); void TestBinTree();
/////////////////////// //////////////////.c #include <assert.h> #include <stdio.h> #include <string.h> #include <malloc.h> //开辟内存空间 PNode BuyBinTreeNode(DataType data) { PNode pNewNode = (PNode) malloc (sizeof(Node)); if(NULL == pNewNode) { assert(0); return NULL; } pNewNode ->_data = data; pNewNode ->_pLeft = NULL; pNewNode ->_pRight = NULL; return pNewNode; } //创建二叉树 void _CreateBinTree(PNode *pRoot,DataType array[],int size,int *index,DataType invalid) { if(*index < size && invalid != array[*index]) { *pRoot = BuyBinTreeNode(array[*index]); //创建根节点的左子树 ++(*index); _CreateBinTree(&(*pRoot)->_pLeft,array,size,index,invalid); //创建根节点的右子树 ++(*index); _CreateBinTree(&(*pRoot)->_pRight,array,size,index,invalid); } } //封装 void CreateBinTree(PNode *pRoot,DataType array[],int size,DataType invalid) { int index = 0; _CreateBinTree(pRoot,array,size,&index,invalid); } //拷贝二叉树 PNode CopyBinTree(PNode pRoot) { PNode pNewRoot = NULL; if(pRoot) { pNewRoot = BuyBinTreeNode(pRoot->_data); if(pRoot -> _pLeft) pNewRoot ->_pLeft = CopyBinTree(pRoot->_pLeft); if(pRoot -> _pRight) pNewRoot ->_pRight = CopyBinTree(pRoot->_pRight); } return pNewRoot; } //前序遍历 void PreOrder(PNode pRoot) { if(pRoot) { printf("%c ",pRoot->_data); PreOrder(pRoot->_pLeft); PreOrder(pRoot->_pRight); } } //中序遍历 void InOrder(PNode pRoot) { if(pRoot) { InOrder(pRoot->_pLeft); printf("%c ",pRoot->_data); InOrder(pRoot->_pRight); } } //后序遍历 void PostOrder(PNode pRoot) { if(pRoot) { PostOrder(pRoot->_pLeft); PostOrder(pRoot->_pRight); printf("%c ",pRoot->_data); } } //销毁二叉树 void DestroyBinTree(PNode *pRoot) { assert(pRoot); if(*pRoot) { DestroyBinTree(&(*pRoot)->_pLeft); DestroyBinTree(&(*pRoot)->_pRight); free(*pRoot); *pRoot = NULL; } } //测试 void TestBinTree() { char *str = "ABD###CE##F"; PNode pRoot = NULL , pNewRoot = NULL; CreateBinTree(&pRoot,str,strlen(str),'#'); pNewRoot = CopyBinTree(pRoot); //前序遍历 PreOrder(pRoot); printf("\n"); //中序遍历 InOrder(pRoot); printf("\n"); //后序遍历 PostOrder(pRoot); printf("\n"); }
#include <stdlib.h> #include "BinaryTree.h" int main() { TestBinTree(); system("pause"); return 0; }