二叉树的数据结构
typedef char SearchTreeType;
typedef struct SearchTreeNode
{
SearchTreeType key; // 关键码
struct SearchTreeNode* lchild;
struct SearchTreeNode* rchild;
} SearchTreeNode;
二叉树的初始化
由于我们是用一个指向根节点的指针表示一个二叉树, 所以初始化的时候就是让这个指针指向空, 表示一个空树
void SearchTreeInit(SearchTreeNode** root)
{
if(root == NULL)
{
return;//非法输入
}
*root = NULL;
}
二叉树的查找
将要查找的元素的值和根节点的值进行比较, 如果相等直接返回, 如果不相等, 就将要查找的元素的值和根节点的值比较, 如果根节点小于要查找的值, 就在左子树中去查找, 如果大于根节点的值, 就在右子树上查找
SearchTreeNode* SearchTreeFind(SearchTreeNode* root, SearchTreeType to_find)
{
if(root == NULL)
{
return NULL;
}
if(root -> key == to_find)
{
return root;
}
else if(root -> key < to_find)
{
return SearchTreeFind(root -> rchild, to_find);
}
return SearchTreeFind(root -> lchild, to_find);
}
二叉树的插入
插入分为两种情况, 当数为空的时候就直接创建一个结点然后将其直接插入. 当二叉树不为空的时候, 此时就定义一个 parent 指针指向根节点, 然后判断 parent 指针指向的结点的值和要插入值的值 key 比较. 如果 parent 指针指向的结点的值小于 key, 就递归地在左子树中插入, 如果大于就递归在右子树上插入.
void SearchTreeInsert(SearchTreeNode** root, SearchTreeType key)
{
if(root == NULL)
{
return;
}
SearchTreeNode* new_node = Creat(key);
if(*root == NULL)
{
*root = new_node;
return;
}
SearchTreeNode* parent = *root;
if(parent -> key < key)
{
SearchTreeInsert(&parent -> rchild, key);
}
else
{
SearchTreeInsert(&parent -> lchild, key);
}
}