【二叉搜索树】

随机生成时平均深度为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 }
View Code

相关文章: