1:创建结点
#define MAXLEN 20 typedef char DATA; typedef struct CBT { DATA data; struct CBT *left; struct CBT *right; }CBTType;2:初始化树的根
CBTType *InitTree()//初始化树的根 { CBTType *node; if(node=(CBTType*)malloc(sizeof(CBTType))) //申请内存 { printf("请先输入一个根节点数据:\n"); scanf("%s",&node->data); node->left = NULL; node->right = NULL; if (node!=NULL)//二叉树根节点不为空 {return node;} else {return NULL;} } }3:显示节点数据
void TreeNodeData(CBTType *p) { printf("%c",p->data); }4:获取左子树
CBTType*TreeLeftNode(CBTType*treeNode) { if (treeNode) {return treeNode->left;} else {return NULL;} }5:获取右子树
CBTType *TreeRightNode(CBTType *treeNode) { if (treeNode) {return treeNode->right;} else {return NULL;} }6:判断是否为空树
int TreeIsEmpty(CBTType *treeNode) { if (treeNode) { return 0; } else { return 1; } }7:清空树
void ClearTree(CBTType *treeNode) { if (treeNode) { ClearTree(treeNode->left); ClearTree(treeNode->right); free(treeNode); treeNode = NULL; } }8:先序遍历
void DLR(CBTType *treeNode, void(*TreeNodeData)(CBTType *p)) { if (treeNode) { TreeNodeData(treeNode); DLR(treeNode->left, TreeNodeData); DLR(treeNode->right, TreeNodeData); } }9:中序遍历
void LDR(CBTType *treeNode, void(*TreeNodeData)(CBTType *p)) { if (treeNode) { LDR(treeNode->left, TreeNodeData); TreeNodeData(treeNode); LDR(treeNode->right, TreeNodeData); } }10:查找节点
CBTType *TreeFindNode(CBTType *treeNode, DATA data)//查找节点 { CBTType *ptr; if (treeNode==NULL) {return NULL;} else { if (treeNode->data==data) {return treeNode;} else { if(ptr== TreeFindNode(treeNode->left,data))//分别向左右子树递归查找 {return ptr;} else if (ptr == TreeFindNode(treeNode->right, data)) {return ptr;} else {return NULL;} } } }11:计算二叉树深度
int TreeDepth(CBTType *treeNode) { int depleft, depright; if (treeNode == NULL) { return 0; } else { depleft = TreeDepth(treeNode->left); depright = TreeDepth(treeNode->right); if (depleft>depright) { return depleft + 1; } else { return depright + 1; } } }12:按层遍历
void LevelTree(CBTType *treeNode,void(*TreeNodeData)(CBTType *p)) { CBTType *p; CBTType *q[MAXLEN]; //定义一个顺序栈 int head = 0, tail = 0; if (treeNode)//如果队首指针不为空 { tail = (tail+1) % MAXLEN; //计算循环队列的队尾 q[tail]= treeNode; } while (head!= tail) { head = (head + 1) % MAXLEN; p = q[head]; TreeNodeData(p); if (p->left!=NULL) { tail = (tail + 1) % MAXLEN; q[tail] = p->left; } if (p->right != NULL)/ /如果存在右子树 { tail = (tail + 1) % MAXLEN; q[tail] = p->right; } } }