#include<iostream>
using namespace std;
//定义一个节点结构体
struct node
{
int key_value;
node *p_left;
node *p_right;
};
node *insert (node* p_tree,int key);
node *search (node* p_tree,int key);
void destroy_tree(node* p_tree);
node *remove (node* p_tree, int key);
int main()
{
return 0;
}
//在树中插入新节点
node *insert (node *p_tree, int key)
{
//基本条件:我们到达了一颗空树 需要将新节点插入到这里
if(p_tree == NULL)
{
node* p_new_tree = new node;
p_new_tree->p_left = NULL;
p_new_tree->p_right = NULL;
p_new_tree->key_value = key;
return p_new_tree;
}
// 决定将新节点插入到左子树或右子树中
// 取决于新节点的值
if(key < p_tree->key_value)
{
//根据p_tree->left和新增key值,构建一颗新树
//然后用一个指向新树的指针来替换现有的p_tree -> left
//之所以需要提替换现有 p_tree -> left 是为了防止
//原有的p_tree -> left为 NULL的情况(如果不为NULL,
// p_tree->left 实际上不会改变,但替换下也无妨
p_tree -> p_left = insert(p_tree -> p_left,key);
}
else
{
//插入到右子树的情况与插入到左子树是对称的
p_tree -> p_right = insert(p_tree -> p_right,key);
}
return p_tree;
}
//在树中搜索
node *search(node *p_tree,int key)
{
//如果到达了空树,很明显,值key不在这颗树中!
if(p_tree == NULL)
{
return NULL;
}
//如果找打了key值,搜索完成
else if(key == p_tree->key_value)
{
return p_tree;
}
//否则,尝试在左子树或右子树中寻找
else if(key<p_tree->key_value)
{
return search(p_tree->p_left,key);
}else
{
return search(p_tree->p_right,key);
}
}
//删除树
//destroy_tree函数应该也是递归。该算法 先删除当前节点的两颗子树
//然后再删除当前节点。
void destroy_tree(node *p_tree)
{
if(p_tree!=NULL)
{
destroy_tree(p_tree->p_left);
destroy_tree(p_tree->p_right);
//为了帮助理解整个递归调用过程,可以在删除节点之前输出节点的值
delete p_tree;
}
}
//可视化过程 ,每个栈都有效地存储了树的哪一个分支已经被删除了
// destroy_tree(<子树>)
// destroy_tree(<树>) -知道这里的 "子树" 是左子树还是右子树