二叉树建立/遍历/复制/映像/节点删除/释放空间
来源:互联网 发布:江门美工家具定制 编辑:程序博客网 时间: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
- 二叉树建立/遍历/复制/映像/节点删除/释放空间
- 递归二叉树建立、遍历、删除、打印
- 二叉树建立、各种遍历、求叶子节点
- 二叉树的建立,遍历,节点个数,深度
- 关于二叉树,建立、遍历、求节点最大距离
- 二叉树 创建 释放 遍历
- 二叉树 建立 遍历
- 二叉树建立、遍历
- 二叉树的建立删除及三种遍历实现
- 二叉树的建立删除及三种遍历实现
- 数据结构之二叉查找树的建立遍历删除
- 顺序二叉树的建立、查找、删除、插入、替换、遍历
- 二叉树删除节点
- 二叉树删除节点
- 二叉树删除节点
- java实现二叉树的建立,前中后序遍历,层次遍历,深度,节点个数等
- 二叉树的建立、节点查找以及节点删除C和C++实现
- 二叉树的建立、节点查找以及节点删除C和C++实现
- autolayout的使用
- AJAX POST&跨域 解决方案 - CORS
- 【杭电】[2028]Lowest Common Multiple Plus
- OpenID
- 面试复习必备之:反射
- 二叉树建立/遍历/复制/映像/节点删除/释放空间
- 现代优化算法 之 遗传算法
- li浮动引起ul高度坍陷的解决方法
- 各种排序算法的分析及java实现
- 20位活跃在Github上的国内技术大牛
- 开源日志采集系统比较:scribe、chukwa、kafka、flume
- PHP的核心Zend Engine
- apk 反编译
- csharp正则表达式的使用