#include <stdio.h> #include <stdlib.h> #include <strings.h> #include <assert.h> #define TRUE 1 #define FALSE 0 typedef int datatype; typedef struct node { datatype data; struct node *lchild, *rchild; }btree; void creat_btree(btree **bt); void preorder_btree(btree *bt); void inorder_btree(btree *bt); void postorder_btree(btree *bt); int depth_btree(btree *bt); void free_btree(btree **bt); int find_btree(btree *bt, datatype x); void exchange_btree(btree *bt); void travel_btree(btree *bt); int main (int argc, char *argv[]) { btree *bt = NULL; creat_btree(&bt); preorder_btree(bt); putchar(‘\n‘); /* inorder_btree(bt); putchar(‘\n‘); printf("%d\n",depth_btree(bt)); free_btree(&bt); preorder_btree(bt); putchar(‘\n‘); */ exchange_btree(bt); preorder_btree(bt); putchar(‘\n‘); travel_btree(bt); putchar(‘\n‘); //printf("%d\n",find_btree(bt,8)); return 0; } void creat_btree(btree **bt) { int n; scanf("%d",&n); if(n == 0){ return; } else{ *bt = (btree*)malloc(sizeof(btree)); (*bt)->data = n; (*bt)->lchild = NULL; (*bt)->rchild = NULL; creat_btree(&(*bt)->lchild); creat_btree(&(*bt)->rchild); } } void preorder_btree(btree *bt)//前序遍历 { if(bt != NULL){ printf("%d,",bt->data); preorder_btree(bt->lchild); preorder_btree(bt->rchild); } } void inorder_btree(btree *bt)//中序遍历 { if(bt != NULL){ inorder_btree(bt->lchild); printf("%d,",bt->data); inorder_btree(bt->rchild); } } void postorder_btree(btree *bt)//后序遍历 { if(bt != NULL){ postorder_btree(bt->lchild); postorder_btree(bt->rchild); printf("%d,",bt->data); } } //树的先序遍历非递归算法 /* if(跟不空){ 根入栈; } while(栈不空){ 出栈; 访问出栈节点; 右子树入栈; 左子树入栈; } */ void travel_btree(btree *bt)//栈实现二叉数的遍历 { btree* stack[50]; btree* temp; int top = 0; if(bt){ stack[top] = bt; top++; } while(top > 0){ top--; temp = stack[top]; printf("%d,",stack[top]->data); if(temp->rchild != NULL){ stack[top] = temp->rchild; top++; } if(temp->lchild != NULL){ stack[top] = temp->lchild; top++; } } } int depth_btree(btree *bt)//二叉树深度 { int ldepth = 0, rdepth = 0; if(bt == NULL) return 0; ldepth = depth_btree(bt->lchild)+1; rdepth = depth_btree(bt->rchild)+1; return ldepth >= rdepth ? ldepth : rdepth; } void free_btree(btree **bt)//释放二叉树 { if(*bt != NULL){ free_btree(&(*bt)->lchild); free_btree(&(*bt)->rchild); free(*bt); *bt = NULL; } } int find_btree(btree *bt, datatype x)//查找二叉树中是否有某个节点 { if(bt != NULL){ if(x == bt->data){ return TRUE; } else{ if(find_btree(bt->lchild,x) || find_btree(bt->rchild,x)) return TRUE; return FALSE; } } } void exchange_btree(btree *bt)//交换二叉数 { btree* temp; if(bt != NULL){ exchange_btree(bt->lchild); exchange_btree(bt->rchild); temp = bt->lchild; bt->lchild = bt->rchild; bt->rchild = temp; } }
原文:http://blog.csdn.net/a987860319/article/details/19046763