二叉查找树的建立和删除
//二叉查找树的非递归查找建立二叉树
1 #include <iostream> 2 using namespace std; 3 4 struct knot 5 { 6 int key; 7 knot *left; 8 knot *right; 9 }; 10 11 int main() 12 { 13 int temp; 14 cin >> temp; 15 knot *root = new knot(); 16 root->key = temp; 17 root->left = nullptr; 18 root->right = nullptr; 19 while (cin.peek() != '\n') 20 { 21 knot *t, *troot = root; 22 cin >> temp; 23 while (troot) 24 { 25 t = troot; 26 //在这里使用一个临时变量记录变化前的troot可以简化判断条件, 27 //当troot找到底(nullptr)的时候,t可以记录最后一个叶子节点 28 if (temp == troot->key) 29 break; 30 else if (temp > troot->key) 31 troot = troot->right; 32 else 33 troot = troot->left; 34 } 35 if (troot) 36 continue; 37 else 38 { 39 knot *tt = new knot; 40 tt->key = temp; 41 tt->left = nullptr; 42 tt->right = nullptr; 43 44 if (temp > t->key) 45 t->right = tt; 46 else 47 t->left = tt; 48 } 49 } 50 return 0; 51 }
二叉树的删除有两种方法
1,采用替换的方法进行删除。
有三种可能的情况,但是从二叉树形态结构的角度来说,删除节点左右都有子树和只有一个子树实际上可以统一为一种情况。因为从结构上来讲,都只有一个分枝发生了删去,只不过(3)还要多改变一个值罢了。但是改变一个值肯定比挪动一个叶子节点到分支容易
更改值比更改树的结构要简单的多。所以注意不同删除后树的总体形态结构的变化。
//情况2转化为情况3的核心部分 bool b_delete(knot *&root, const int k) { knot *pointer = b_find(root, k); if (pointer) return false; knot *child, *parent, *ptr = pointer; if (pointer->left && poiner->right) { parent = pointer; pointer = pointer->right; while (pointer->left) { parent = pointer; pointer = pointer->left; } } //情况3已转化为·2 //此处为处理情况2 ··· //改变情况3的值 if(ptr!=pointer) ptr->key=pointer->key; delete pointer; }
2,采用截枝的方法进行删除。

浙公网安备 33010602011771号