二叉查找树的建立和删除

//二叉查找树的非递归查找建立二叉树
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,采用截枝的方法进行删除。

posted @ 2021-04-12 17:19  Macondo's  阅读(185)  评论(0)    收藏  举报