二叉树

#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(<树>) -知道这里的 "子树" 是左子树还是右子树

 

posted @ 2015-04-15 15:14  woaijava  阅读(65)  评论(0编辑  收藏  举报