二叉树的增加:
插入数据x,从根节点开始,不断比较节点与x的大小;
若x小于节点,下一次比较x与节点的左子树,反之,比较x与节点的右子树;
直到遇到一个空的节点,插入数据.
二叉树的删除分三种情况:
- 删除的节点为叶子节点: 直接删除;
- 删除节点为单子节点: 则子节点继承(替代)位置;
- 删除节点为双子节点:
- 找左右节点树中最接近节点值的节点(删除节点的左子树找最右值 or 右子树找最左值);
- 清除选中节点的原有联系;
- 替换所要删除节点的位置关系;
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
typedef int element_type;
typedef struct tree_node {
element_type element;
struct tree_node *left_child, *right_child;
//struct tree_node *parent;
} tree_node_t;
tree_node_t *tree_node_insert_child(tree_node_t* node, element_type element)
{
if (node == NULL) {
return NULL;
}
tree_node_t* new_node;
while (1)
{
if (element > node->element) {
if (node->right_child) {
node = node->right_child;
}
else {
new_node = (tree_node_t *)malloc(sizeof(tree_node_t));
new_node->element = element;
new_node->left_child = NULL;
new_node->right_child = NULL;
node->right_child = new_node;
printf("add %d as %d is right child\n", new_node->element, node->element);
return new_node;
}
}
else if (element < node->element) {
if (node->left_child) {
node = node->left_child;
}
else {
new_node = (tree_node_t *)malloc(sizeof(tree_node_t));
new_node->element = element;
new_node->left_child = NULL;
new_node->right_child = NULL;
node->left_child = new_node;
printf("add %d as %d is left child\n", new_node->element, node->element);
return new_node;
}
}
else {
/* equal */
printf("%d has exist at tree\n", node->element);
return node;
}
}
}
tree_node_t *tree_node_delete_left_child(tree_node_t* node)
{
if (node == NULL || node->left_child == NULL) {
return node;
}
tree_node_t* del_node = node->left_child;
if (del_node->left_child && del_node->right_child) {
//find rightest child of del node's left side, or leftest child of del node's right side
tree_node_t* near_node = del_node->right_child;
tree_node_t* near_node_parent = del_node;
while (near_node->left_child) {
near_node_parent = near_node;
near_node = near_node->left_child;
}
if (near_node_parent != del_node)
{
/* clear near node's parent */
if (near_node->right_child) {
//if near_node has right child, add to his parent
near_node_parent->left_child = near_node->right_child;
}
else {
near_node_parent->left_child = NULL;
}
/* near node place as del node */
near_node->right_child = del_node->right_child;
near_node->left_child = del_node->left_child;
node->left_child = near_node;
}
else {
//near_node->right_child keep
near_node->left_child = del_node->left_child;
node->left_child = near_node;
}
}
else if (del_node->left_child) {
node->left_child = del_node->left_child;
}
else if (del_node->right_child) {
node->left_child = del_node->right_child;
}
else {
node->left_child = NULL;
}
free(del_node);
return node;
}
tree_node_t *tree_node_delete_right_child(tree_node_t* node)
{
if (node == NULL || node->right_child == NULL) {
return node;
}
tree_node_t* del_node = node->right_child;
if (del_node->left_child && del_node->right_child) {
//find rightest child of del node's left side, or leftest child of del node's right side
tree_node_t* near_node = del_node->left_child;
tree_node_t* near_node_parent = del_node;
while (near_node->right_child) {
near_node_parent = near_node;
near_node = near_node->right_child;
}
if (near_node_parent != del_node)
{
/* clear near node's parent */
if (near_node->left_child) {
//if near_node has right child, add to his parent
near_node_parent->right_child = near_node->left_child;
}
else {
near_node_parent->right_child = NULL;
}
/* near node place as del node */
near_node->right_child = del_node->right_child;
near_node->left_child = del_node->left_child;
node->right_child = near_node;
}
else {
//near_node->left_child keep
near_node->right_child = del_node->right_child;
node->right_child = near_node;
}
}
else if (del_node->left_child) {
node->right_child = del_node->left_child;
}
else if (del_node->right_child) {
node->right_child = del_node->right_child;
}
else {
node->right_child = NULL;
}
free(del_node);
return node;
}
tree_node_t *creat_tree()
{
tree_node_t *node;
element_type element;
scanf("%d", &element);
node = (tree_node_t *)malloc(sizeof(tree_node_t));
node->element = element;
node->left_child = NULL;
node->right_child = NULL;
printf("creat root %d\n", element);
while(1) {
scanf("%d", &element);
if (element == 0) break;
tree_node_insert_child(node, element);
}
return node;
}
#define MAX(a, b) ((a) > (b)? (a): (b))
int get_tree_depth(tree_node_t *root)
{
if (root == NULL) return 0;
int left_depth = get_tree_depth(root->left_child);
int right_depth = get_tree_depth(root->right_child);
return MAX(left_depth,right_depth) + 1;//child depth + cur depth 1
}
static int print_pos_x;
static int print_tree_high;
#define ELMENT_PRINT_SPACE (8)
#define ELMENT_PRINT_OFFSET(m,l) (((m) - (l)) / 2)
#define ELMENT_PRINT_MAX_DEPTH (6)
#define CALC_PRINT_ELMENT_TAKE_PLACE(l,x) ((1 << (l - 1)) * x + x)
#define ELMENT_PRINT_MAX_DEPTH_SPACE CALC_PRINT_ELMENT_TAKE_PLACE(ELMENT_PRINT_MAX_DEPTH, ELMENT_PRINT_SPACE)
char print_buffer[ELMENT_PRINT_MAX_DEPTH][ELMENT_PRINT_MAX_DEPTH_SPACE];
void print_core_tree(tree_node_t* node, int level)
{
if (node == NULL) {
print_pos_x += ELMENT_PRINT_SPACE * (print_tree_high - level) ;
return;
}
print_core_tree(node->left_child, level + 1);
char str_element[10];
sprintf(str_element, "%8d", node->element);
int len = strlen(str_element);
memcpy(&print_buffer[level][print_pos_x + ELMENT_PRINT_OFFSET(ELMENT_PRINT_SPACE, len)], str_element, len);
print_pos_x += ELMENT_PRINT_SPACE;
print_core_tree(node->right_child, level + 1);
}
void print_tree(tree_node_t* root)
{
if (root == NULL) return;
int i,j;
print_pos_x = ELMENT_PRINT_SPACE / 2;
print_tree_high = get_tree_depth(root);
if (print_tree_high > ELMENT_PRINT_MAX_DEPTH) {
printf("warning: only support %d depth\n", ELMENT_PRINT_MAX_DEPTH);
}
for (i = 0; i < ELMENT_PRINT_MAX_DEPTH; i++)
{
for (j = 0; j < ELMENT_PRINT_MAX_DEPTH_SPACE; j++)
{
print_buffer[i][j] = 0x7f;
}
}
print_core_tree(root, 0);
for (i = 0; i < print_pos_x; i++) printf("=");
printf("\n");
for (i = 0; i < print_tree_high; i++)
{
for (j = 0; j < print_pos_x; j++)
{
if (print_buffer[i][j] == 0x7f) printf(" ");
else printf("%c", print_buffer[i][j]);
}
printf("\n");
}
for (i = 0; i < print_pos_x; i++) printf("=");
printf("\n");
}
int main(int argc, char* argv[])
{
tree_node_t *root;
root = creat_tree();
print_tree(root);
tree_node_delete_left_child(root);
print_tree(root);
tree_node_delete_right_child(root);
print_tree(root);
getchar();
}
运行结果图
prefix2suffix.jpg