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