二叉树建立/遍历/复制/映像/节点删除/释放空间

来源:互联网 发布:江门美工家具定制 编辑:程序博客网 时间:2024/05/17 09:16

闲来无事,想起来的当初的二叉树的操作,编码回忆一下;

(1)二叉树的建立

(2)前序 中序 后序遍历二叉树

(3)复制二叉树

(4)将二叉树左右对换,简称映像

(5)删除二叉树中的节点

(6)释放二叉树

#include <stdio.h>#include <stdlib.h>struct tree_type{struct tree_type *left;int data;struct tree_type *right;};struct tree_type *b_tree;static void dump_data(){}static void create_btree(int *list, int len){b_tree = (struct tree_type *)malloc(sizeof(struct tree_type));b_tree->data = list[0];b_tree->left = NULL;b_tree->right = NULL;struct tree_type *parent = b_tree;struct tree_type *cur = b_tree;for(int i = 1; i<len; i++){struct tree_type *new_node = (struct tree_type *)malloc(sizeof(struct tree_type));new_node->data = list[i];new_node->left = NULL;new_node->right = NULL;cur = b_tree;while (cur != NULL){parent = cur;if (cur->data > list[i])cur = cur->left;elsecur = cur->right;}if (parent->data > list[i])parent->left = new_node;elseparent->right = new_node;}}/*释放二叉树的空间*/void realse_node(struct tree_type *root){if(root->left) {realse_node(root->left);root->left = NULL;}if(root->right) {realse_node(root->right);root->right = NULL;}if (root->left == NULL && root->right == NULL) {printf("release node :%d\n", root->data);free(root);root= NULL;}}/*前序遍历 根左右*/void pre_order(struct tree_type *pointer){if (pointer){printf("%d ", pointer->data);pre_order(pointer->left);pre_order(pointer->right);}}/*中序遍历 左根右*/void mid_order(struct tree_type *pointer){if (pointer){mid_order(pointer->left);printf("%d ", pointer->data);mid_order(pointer->right);}}/*后序遍历 左右根*/void post_order(struct tree_type *pointer){if (pointer){post_order(pointer->left);post_order(pointer->right);printf("%d ", pointer->data);}}/*用递归法简历二叉树,该方法效果不好,暂时记录一下吧*/struct tree_type * create_btree2(int *list, int pos, int len){struct tree_type *newnode;if (pos > len)return NULL;newnode = (struct tree_type *)malloc(sizeof(struct tree_type));newnode->data = list[pos];newnode->left = create_btree2(list, 2*pos, len);newnode->right = create_btree2(list, 2*pos + 1, len);return newnode;}/*二叉树二分查找法*/struct tree_type* btree_traversal_search(struct tree_type *pointer, int find_data){while(pointer != NULL){if (pointer->data == find_data)return pointer;else if (pointer->data > find_data)pointer = pointer->left;elsepointer = pointer->right;}return NULL;}/*查找节点是否在二叉树中*/struct tree_type* binary_search(struct tree_type *pointer, int find_data, int *pos){struct tree_type * parent;parent = pointer;*pos = 0;while(pointer != NULL){if (pointer->data == find_data)return parent;else{parent = pointer;if (pointer->data > find_data){pointer = pointer->left;*pos = -1; /*设置其为左子树时 pos = -1*/}else{pointer = pointer->right;*pos = 1;/*设置其为右子树时 pos = 1*/}}}return NULL;}/*二叉树删除一个节点*/struct tree_type *btree_delete_node(struct tree_type *root, int node){struct tree_type *parent, *current, *child;int pos;/*寻找要删除节点的父节点指针*/parent = binary_search(root, node, &pos);if (parent == NULL) /*节点不在二叉树中*/return root;else{switch (pos){case -1:/*左子节点*/current = parent->left;break;case 1:/*右子节点*/current = parent->right;break;case 0:current = parent;break;}/*没有左子树 也 没有右子树*/if(current->left == NULL && current->right == NULL){switch (pos){case -1:/*左子节点*/parent->left = NULL;free(current);break;case 1:/*右子节点*/parent->right = NULL;free(current);break;case 0:parent = NULL;break;}return root;}/*没有左子树*/if(current->left == NULL && current->right != NULL){if(parent != current){if (pos == 1)parent->right = current->right;else if (pos == -1)parent->left = current->right;}else{root = root->right;}free(current);current = NULL;return root;}/*没有右子树*/if(current->left != NULL && current->right == NULL){if(parent != current){if (pos == 1)parent->right = current->left;else if (pos == -1)parent->left = current->left;}else{root = root->left;}free(current);current = NULL;return root;}/*左右子树都有, 此种情况是找个叶子节点替换当前点,树的结构不动*/if(current->left != NULL && current->right != NULL){parent = current;child = current->left;/*找叶子节点,用来替换当前节点*//*while(child->right != NULL){parent = child;child = child->right;}*/while (1){if (child->right != NULL){parent = child;child = child->right;} else if (child->left != NULL){parent = child;child = child->left;}/*找到了叶子节点*/if (child->left == NULL && child->right == NULL)break;}current->data = child->data;/*替换要删除的节点*//*叶子节点的父节点 修改左右指针*/if(parent->left == child)parent->left = NULL;else if(parent->right == child)parent->right = NULL;free(child);/*删除节点*/return root;}}}/*二叉树的复制*/struct tree_type *copy_tree(struct tree_type *root){struct tree_type *newnode;if (root == NULL)return NULL;else{newnode = (struct tree_type *)malloc(sizeof(struct tree_type));newnode->data = root->data;newnode->left = copy_tree(root->left);newnode->right = copy_tree(root->right);return newnode;}}/*二叉树的影像 左右互换*/struct tree_type *swap_tree(struct tree_type *root){struct tree_type *swaptree;if (root!=NULL){swaptree = (struct tree_type *)malloc(sizeof(struct tree_type));swaptree->data = root->data;swaptree->left = swap_tree(root->right);swaptree->right = swap_tree(root->left);return swaptree;}elsereturn NULL;}int main(int argc, char **argv){int list[] = {6,9,7,4,5,2,1,8,12};int len = sizeof(list)/sizeof(list[0]);create_btree(list, len);printf("\nPre Order:\n");pre_order(b_tree);printf("\nMid Order:\n");mid_order(b_tree);printf("\nPost Order:\n");post_order(b_tree);struct tree_type *p_cpy_tree = copy_tree(b_tree);printf("\nCopy Post Order:\n");post_order(p_cpy_tree);printf("\nrelease data:\n");realse_node(p_cpy_tree);struct tree_type *p_swap_tree = swap_tree(b_tree);printf("\nswap Post Order:\n");post_order(p_swap_tree);btree_delete_node(b_tree, 6);printf("\nMid Order:\n");mid_order(b_tree);int list2[] = {0,6,9,7,4,5,2,1,8,12};int len2 = sizeof(list2)/sizeof(list2[0]) - 1;struct tree_type *b_tree2 = create_btree2(list2, 1, len2);printf("\n2 Pre Order:\n");pre_order(b_tree2);printf("\n2 Mid Order:\n");mid_order(b_tree2);printf("\n2 Post Order:\n");post_order(b_tree2);//need free data//realse_node(b_tree);}


0 0
原创粉丝点击