刪除有兩個節點的二叉樹節點的刪除策略
找到右子樹中值最小的節點,或者找到左子樹中最大的節點,稱之為最優值節點,這個節點的值是最適合提替換要刪除節點的,替換值之後,刪除最優值節點,因為最優值節點一定是不會是有兩個子節點的節點,所以刪除就方便許多;
寫了點**記錄下:
主要技巧是遞迴的使用,是最重要的操作二叉樹的技巧:
//定義的二叉樹的節點
/* * 傳入數字時候,柚子樹比作字數達
*/typedef struct treetree;
然後是插入操作:
/*
* 新增程式
* 連線父節點要做到
* 使用
*/int add(tree * root, tree * father, int value) else
} current = malloc(sizeof(tree));
current->val = value;
current->left = null;
current->right = null;
if (value <= father->val) else
// printf("value is %d location is %d\n",value,current);
return 1;
}
//列印所有的節點資料
//先序遍歷
void printtree(tree* root) else
}
最後是刪除的程式:因為定義節點時候選擇沒有定義父節點,所以需要找到刪除節點之前的乙個節點
//獲取到需要刪除節點的父節點位址,然後通過比較
//得到需要刪除的節點是哪個
//首先直接傳入pro 也就是父節點,不考慮根節點情況 也就是pro 和value 值不相等
int findpro(tree* pro, int value) else else
} } else else else
} }}
然後就是根據三種情況對節點進行刪除,我沒寫root節點的刪除,都是乙個邏輯而已:
/**
* 根據值刪除乙個節點
* 三種情況,
* 一是刪除沒有子節點的
* 二是刪除有乙個子節點的
* 三是刪除有兩個子節點的
* 首先根據值找到節點,值是可能會重複的,那就先刪除乙個值
* */
void deleteitem(tree * root, int value) else else if (current->left != null && current->right == null) else if (current->right != null && current->left == null) else if (current->left == null && current->right == null)
} else else if (current->left != null && current->right == null) else if (current->right != null && current->left == null) else if (current->left == null && current->right == null)
} }}
其中,刪除既有左子樹又有右子樹的程式我是通過右子樹裡面找最小的去實現的:
/*
* 刪除同時有兩個葉子節點的二叉樹
* 不需要節點之前的節點,使用替換的方式進行
* 只不過需要找到替換值之前的那個節點進行刪除
*/void deledoublechild(tree*root) else
//最後乙個沒有左子樹
root->val = current->left->val;
current->left = null;
free(current->left);
}}
程式結構應該還有改動的可能,還需要測試測試
二叉樹的刪除
二叉排序樹的刪除 對於一般的二叉樹來說,刪去樹中的乙個結點是沒有意義的,因為它將使以被刪除的結點為根的子樹變成森林,破壞了整棵樹的結構 但是,對於二叉排序樹,刪去樹上的乙個結點相當於刪去有序序列中的乙個記錄,只要在刪除某個結點後不改變二叉排序樹的特性即可。在二叉排序樹上刪除乙個結點的演算法如下 bt...
二叉樹的刪除
1 如果刪除的節點是葉子節點,則刪除該節點。2 如果刪除的節點是非葉子節點,則刪除該子樹。description 二叉樹實戰 date 2021 3 16 author cakin public class binarytreedemo classname binarytreedemo descri...
二叉樹刪除詳解
二叉查詢樹的刪除過程 假設要刪除樹t中的某節點z,此時對於如何刪除z要分三種情況考慮 1.z無子女 此時直接刪除z即可 z無子女 tree delete0 t,z 2.z有乙個子女 用其子節點代替自己即可 z只有乙個子女 tree delete1 t,z 3.z有兩個子女 刪除z的後繼y y不會有左...