BiTree.h #ifndef BITREE_H_H #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct BiLNode { ElemType data; struct BiLNode *lchild; struct BiLNode *rchild; }BiTree; int init_BiTree(BiTree*); int make_node(BiLNode**); int create_BiTree(BiTree**); int preOrderTraverse_BiTree(BiTree*); int inOrderTraverse_BiTree(BiTree*); int postOrderTraverse_BiTree(BiTree*); int levelOrderTraverse_BiTree(BiTree*); int destroy_BiTree(BiTree**); int empty_BiTree(BiTree*); int depth_BiTree(BiTree*); int getValue_BiTree(BiTree*, ElemType*); int assign_BiTree(BiTree*, ElemType); int parent_BiTree(BiTree*, BiLNode**, BiLNode*); int leftChild_BiTree(BiTree*, BiLNode**, BiLNode*); int rightChild_BiTree(BiTree*, BiLNode**, BiLNode*); int leftSibling_BiTree(BiTree*, BiLNode**, BiLNode*); int rightSibling_BiTree(BiTree*, BiLNode**, BiLNode*); int insertChild_BiTree(BiTree*, BiTree*, BiLNode*, int); int deleteChild_BiTree(BiTree*, BiLNode*, int); #endif BiTree.cpp #include<stdio.h> #include<stdlib.h> #include"BiTree.h" int init_BiTree(BiTree *btree) { btree = NULL; return OK; } //后续遍历销毁二叉表 int destroy_BiTree(BiTree **btree) { if((*btree) == NULL) return ERROR; else { destroy_BiTree(&(*btree)->lchild); destroy_BiTree(&(*btree)->rchild); free(*btree); (*btree) = NULL; } return OK; } int make_node(BiLNode **node) { if(!((*node) = (BiLNode*)malloc(sizeof(BiLNode)))) return ERROR; return OK; } int create_BiTree(BiTree **btree) { char ch; scanf("%c",&ch); if(ch == '#') { (*btree) = NULL; } else { if(!make_node(btree)) return ERROR; (*btree)->data = ch; create_BiTree(&(*btree)->lchild); create_BiTree(&(*btree)->rchild); } return OK; } int empty_BiTree(BiTree *btree) { if(btree == NULL) return true; return false; } //求二叉树深度 int depth_BiTree(BiTree *btree) { int dep = 0; int dep1 = 0; if(btree == NULL) return 0; else { dep = depth_BiTree(btree->lchild) ; dep1 = depth_BiTree(btree->rchild); return dep > dep1 ? dep + 1 : dep1 + 1; } return OK; } int getValue_BiTree(BiTree *btree, ElemType *e) { if(btree == NULL) return ERROR; *e = btree->data; return OK; } int assign_BiTree(BiTree *btree, ElemType e) { if(btree == NULL) return ERROR; btree->data = e; return OK; } //返回e结点的双亲 int parent_BiTree(BiTree *btree, BiLNode **parent, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp ->lchild == e || tmp->rchild == e) { (*parent) = tmp; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //返回e结点的左孩子 int leftChild_BiTree(BiTree *btree, BiLNode **lchild, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp == e) { (*lchild) = tmp->lchild; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //返回e结点的右孩子 int rightChild_BiTree(BiTree *btree, BiLNode **rchild, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp == e) { (*rchild) = tmp->rchild; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //返回结点左兄弟 int leftSibling_BiTree(BiTree *btree, BiLNode **lsib, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp ->lchild == e || tmp->rchild == e) { if(tmp->lchild == e) (*lsib) = NULL; else (*lsib) = tmp->lchild; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //返回结点右兄弟 int rightSibling_BiTree(BiTree *btree, BiLNode **rsib, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp ->lchild == e || tmp->rchild == e) { if(tmp->rchild == e) (*rsib) = NULL; else (*rsib) = tmp->rchild; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //在e的位置插入c到二叉树 //条件: c的右子树必为空,flag是在左还是右插入,0 左 1 右 int insertChild_BiTree(BiTree *btree, BiTree *c, BiLNode *e, int flag) { if(c->rchild != NULL) return ERROR; BiLNode *queue[30], *tmp, *tmp1; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp == e) { //在左边插入树 if(flag == 0) { tmp1 = tmp->lchild; tmp->lchild = c; c->rchild = tmp1; } else if(flag == 1) { //在右边插入树 tmp1 = tmp->rchild; tmp->rchild = c; c->rchild = tmp1; } else { return ERROR; } break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } int deleteChild_BiTree(BiTree *btree, BiLNode *e, int flag) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp == e) { if(flag == 0) { destroy_BiTree(&tmp->lchild); } else if(flag == 1) { destroy_BiTree(&tmp->rchild); } else { return ERROR; } break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //先序递归遍历二叉树 int preOrderTraverse_BiTree(BiTree *btree) { if(btree == NULL) return ERROR; else { printf("%c ", btree->data); preOrderTraverse_BiTree(btree->lchild); preOrderTraverse_BiTree(btree->rchild); } return OK; } //中序递归遍历二叉树 int inOrderTraverse_BiTree(BiTree *btree) { if(btree == NULL) return ERROR; else { inOrderTraverse_BiTree(btree->lchild); printf("%c ", btree->data); inOrderTraverse_BiTree(btree->rchild); } return OK; } //后序递归遍历二叉树 int postOrderTraverse_BiTree(BiTree *btree) { if(btree == NULL) return ERROR; else { postOrderTraverse_BiTree(btree->lchild); postOrderTraverse_BiTree(btree->rchild); printf("%c ", btree->data); } return OK; } //层次递归遍历二叉树(利用队列实现) int levelOrderTraverse_BiTree(BiTree *btree) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; printf("%c ", tmp->data); if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; }