天道酬勤,每日記點筆記也是蠻有意思的。
插入函數(shù):
#include <assert.h>
#include <stdio.h>
#include <malloc.h>
typedef TREE_TYPE int;
typedef struct TREE_NODE{
TREE_TYPE value;
struct TREE_NODE *left;
struct TREE_NODE *right;
}TreeNode;
static TreeNode *tree;
/*
insert
*/
void insert(TREE_TYPE value){
TreeNode *current; //point to the current node
TreeNode **linked; //pointer pointing to another pointer
linked = &tree;
// as we know,left node is less than mid, and mid bigger than right
// left < mid < right
while( (current = *linked) != NULL ){
if(current->value > value){
linked = ¤t->left;
}else{
assert(value != current->value);
linked = ¤t->right;
}
}
/*
now find which position to insert the node
because of the node is left ,means the end
*/
current = (TreeNode *)malloc(sizeof(TreeNode));
assert(current != NULL);//guarantee The memory alloced never be NULL
current->value = value;
current->left =NULL;
current->right = NULL;
*linked = current;
}
find函數(shù)相對來說簡單一些:
TREE_TYPE *find(TREE_TYPE value)
{
TreeNode *current; //this time ,just use one simple pointer
current = tree;
// notice node and child relation : left < mid < right
while(current != NULL && current->value != value){
if(value < current->value)
current = current->left
else
current = current->right
}
// not find
if(current == NULL) return NULL;
return ¤t->value; // return a pointer means you can change it!
}
前序(pre-order)遍歷,即先遍歷當前中間節(jié)點,后遍歷左節(jié)點和右節(jié)點。這里使用遞歸比較合適:
notice : pre-order / in-order / post-order / breadth-first
static void do_pre_order_traverse(TreeNode *current,void (*callback)(TREE_TYPE value)){
if(current != NULL){
callback(current->value); //do something with mid item
do_pre_order_traverse(current->left);//do something with left item
do_pre_order_traverse(current->right);//do something with right item
}
}
void pre_order_traverse(void (*callback)(TREE_TYPE value)){
do_pre_order_traverse(tree,callback);
}