关于学习二叉搜索树的心得体会

xiaoxiao2021-02-28  96

   首先,二叉搜索树是建立在此树是一棵中序遍历的二叉树的前提下的,基本原理也就是先将关键值与根节点进行比较,如果比根节点的data值小,就在此树的左树中去寻找,如果比根节点的data值大,就在该树的右子树中去找,当然,如果关键值和根节点的data值相等,就是找到了。实际上就是一个简单的递归调用。需要注意的是,同样一组数据,选择不同的树做根结点,所建立的二叉搜索树结果是不同的。

BSTNode<Type>* Search(BSTNode<Type> *t, const Type &key)const { if(t == NULL) return NULL; if(t->data == key) return t; else if(key < t->data) Search(t->leftChild, key); else Search(t->rightChild, key); }

其实二叉搜索树的其他性质基本都是在像这样循环调用。下面将简单列举几个:

(1).二叉树的插入。

         1.第一步,搜索要插入的值在二叉树中是否已经存在,如果存在,则不需要插入,直接返回就好。如果不存在,在进行插入。

         2.插入时,要根据值去插入,保证它在插入之后的大小顺序,逐层遍历,如果比根节点的值小在根节点的左子树中去寻找合适位置,如果比根节点的值大就去右子树中寻找合适位置插入,始终保证左结点比根节点小,右子树比根节点大。

bool Insert(BSTNode<Type> *&t, const Type &x) { if(t == NULL) { t = new BSTNode<Type>(x); return true; } else if(x < t->data) Insert(t->leftChild, x); else if(x > t->data) Insert(t->rightChild, x); else  return false; }

(2).二叉搜索树结点的删除。

关于结点删除有三种分类

1.该节点没有孩子结点,直接删除。

2.该节点有左孩子或者有后孩子,删除该节点后让孩子结点顶替自身位置,与上层树进行连接。

3.该节点既有左孩子又有后孩子,删除后就要考虑那个结点要顶替自身位置,与上层树连接的问题。

如果是左子树顶替,就在左子树中找到最大值去頂位,如果是右子树,就在右子树中找到最小的去顶替。

以上三种情况,同样采用的是递归调用。

bool Remove(BSTNode<Type> *&t, const Type &key) { if(t == NULL) return false; if(key < t->data) Remove(t->leftChild, key); else if(key > t->data) Remove(t->rightChild, key); else { if(t->leftChild==NULL && t->rightChild==NULL) { delete t; t = NULL; } else if(t->leftChild!=NULL && t->rightChild==NULL) { BSTNode<Type> *p = t; t = p->leftChild; delete p; } else if(t->leftChild==NULL && t->rightChild!=NULL) { BSTNode<Type> *p = t; t = p->rightChild; delete p; } else { BSTNode<Type> *p = t->rightChild; while(p->leftChild != NULL) p = p->leftChild; t->data = p->data; Remove(t->rightChild, p->data); } return true; } }

其余的求最大,最小,置空就不一一写了,欢迎指教,技术菜鸟而已,不要太暴躁,我这人经不起批评

转载请注明原文地址: https://www.6miu.com/read-74800.html

最新回复(0)