【二叉搜索树】
随机生成时平均深度为logN,平均插入、删除和搜索时间都是O(logN)。
可能存在的问题是数据不均衡,使树单边生长,极端情况下变成类似链表,最坏插入、删除、搜索时间O(N)
写这个例程也花了些时间,例程主要包括查找、插入、删除、遍历、清空几个内容。
同时避免之前写链表到了半途再修改,拷贝构造、拷贝赋值、析构也写成了深拷贝的模式。
光这两份代码在一起还无法运行,因为层序遍历那一块用了之前写的队列例程。
测试代码:
1 #include <iostream> 2 #include "bstree.h" 3 using bstree::BSTree; 4 int main(void) 5 { 6 //测试插入 7 BSTree<int> number; 8 cout << "additem" << endl; 9 number.additem(8);number.additem(4);number.additem(17);number.additem(3); 10 number.additem(6);number.additem(10);number.additem(18);number.additem(2); 11 number.additem(5);number.additem(7);number.additem(9);number.additem(15); 12 number.additem(19);number.additem(1);number.additem(14);number.additem(16); 13 number.additem(20); number.additem(13); number.additem(11); number.additem(12); 14 //打印 15 number.printpre(); 16 cout << "--preorder"<<endl; 17 number.printin(); 18 cout << "--inorder" << endl; 19 number.printpost(); 20 cout << "--postorder" << endl; 21 number.printseq(); 22 cout << "--seqorder" << endl; 23 24 //测试拷贝构造函数 25 cout << "\ncopy constructor" << endl; 26 BSTree<int> number2(number); 27 number2.printpre(); 28 cout << "--preorder" << endl; 29 number2.printin(); 30 cout << "--inorder" << endl; 31 32 //测试插入重复元素 33 cout << "\ncollision" << endl; 34 number.additem(1); 35 36 //删除测试 37 //删除节点没有右子树 38 cout << "\nremove number 3: iter->right = nullptr" << endl; 39 number.remove(3); 40 number.printpre(); 41 cout << "--preorder" << endl; 42 number.printin(); 43 cout << "--inorder" << endl; 44 45 //删除测试 46 //删除节点的右子树没有左子树 47 cout << "\nremove number 15: iter->right->left = nullptr" << endl; 48 number.remove(15); 49 number.printpre(); 50 cout << "--preorder" << endl; 51 number.printin(); 52 cout << "--inorder" << endl; 53 54 //删除测试 55 //删除节点的右子树有左子树 56 cout << "\nremove number 10: iter->right->left != nullptr" << endl; 57 number.remove(10); 58 number.printpre(); 59 cout << "--preorder" << endl; 60 number.printin(); 61 cout << "--inorder" << endl; 62 63 //删除测试 64 //删除根 65 cout << "\nremove number 8: iter == root" << endl; 66 number.remove(8); 67 number.printpre(); 68 cout << "--preorder" << endl; 69 number.printin(); 70 cout << "--inorder" << endl; 71 72 //删除测试 73 //删除不存在的元素 74 cout << "\nremove number not existed" << endl; 75 number.remove(21); 76 77 //查找最值 78 cout << "\nmax = " << number.findmax()->data << endl; 79 cout << "min = " << number.findmin()->data << endl; 80 81 //清空树,并测试在空树下删除 82 cout << "\nclear" << endl; 83 number.clear(); 84 number.remove(3); 85 86 system("pause"); 87 }