二叉树c++实现
--- 欢迎指正---
二叉树特点:
要么为空树;要么,当前结点的左孩子比当前结点值小,当前结点的右孩子比当前结点的值大。
1、插入:
1.1 插入结点的值比当前结点的值小,继续找当前结点的左子树,
1.2 插入结点的值比当前结点的值大,继续找当前结点的右子树,
1.3 找到合适的位置了,插入树。
2、删除:
2.1 删除结点是叶子结点,直接将其删除即可
2.2 删除结点只有左孩子或者只有右孩子,将其孩子结点删除,并将指向孩子结点的分支设置为空,c++是设置为NULL。不过更好的做法是,将孩子结点的值替换到当前结点,再删除孩子结点即可。
2.3 删除的结点同时含有左孩子与右孩子,需要找到删除结点的后继结点,将后继结点作为当前结点。
完整源码:
#include <iostream> using namespace std; struct node { // 数据域 int data; // 左节点 node *lc; // 右结点 node *rc; // 构造函数 node() : data(0) , lc(NULL) , rc(NULL) { } }; // bst class bstree { public: enum { hmax_size_32767 = 32767, hmin_size_0 = 0, }; public: // 构造函数 bstree() : root(NULL) , size(0) { } // 析构函数 virtual ~bstree(){} int get_size() { return size; } // 插入结点 void insert_node(int data) { int cur_size = get_size(); if (hmax_size_32767 == cur_size) { cout << "insert node error, the size of the tree is max" << endl; return ; } root = insert(root, data); } // 先序遍历(前序遍历) void pre_order() { pre_order_traverse(root); } // 中序遍历 void in_order() { in_order_traverse(root); } // 后序遍历 void post_order() { post_order_traverse(root); } /* 查找某个结点 int key - 查找结果 返回值: NULL : 可能为root为空 或者 没有找到 != NULL, 找到结点 */ node* query(int key) { if (NULL == root) { cout << "query error, root = null" << endl; return NULL; } return query_node(root, key); } // 删除树 void remove_all() { if (NULL == root) { cout << "remove all failed, root = null" << endl; return; } remove_all(root); int cur_size = get_size();