当前位置: 代码迷 >> 综合 >> 二叉排序树(查找树)
  详细解决方案

二叉排序树(查找树)

热度:95   发布时间:2023-11-22 16:41:29.0

二叉查找树:二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的树:

1 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

2 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

3 任意节点的左、右子树也分别为二叉查找树;

4 没有键值相等的节点。

查找树核心查找:searchBET

相等于二分查找法

bool ErChaTree::serachBET(treeNode* root,int val, treeNode *preRoot, treeNode** end)
{if (!root){*end = preRoot;return false;}else if (root->val == val){*end = root;return true;}else if (root->val < val){return serachBET(root->prChild, val, root, end);}else{return serachBET(root->plChild, val, root, end);}return false;
}

end:找到时,等于当前结点,没有找到时等于父节点

插入操作也很简单

bool ErChaTree::insertNode(int val)
{treeNode* end = NULL;if (!serachBET(m_Root, val, NULL, &end)){treeNode* newNode = new treeNode;newNode->val = val;if (!end){m_Root = newNode;}else if (end->val < val){end->prChild = newNode;}else{end->plChild = newNode;}return true;}else{return false;}
}

当该值不存在时,end等于当前值root结点。

删除操作


bool ErChaTree::deleteBETNode(treeNode** root, int val)
{if (!*root){return false;}else if ((*root)->val == val){deleteNode(root);}else if ((*root)->val < val){return deleteBETNode(&(*root)->prChild,val);}else{return deleteBETNode(&(*root)->plChild, val);}return false;
}bool ErChaTree::deleteNode(treeNode ** node)
{treeNode* pCur;treeNode* pNext;pCur = *node;if (pCur->prChild == NULL){*node = pCur->plChild;delete pCur;}else if (pCur->plChild == NULL){*node = pCur->prChild;delete pCur;}else{pNext = pCur->plChild;while (pNext->prChild){pCur = pNext;pNext = pNext->prChild;}(*node)->val = pNext->val;if (pCur != *node){pCur->prChild = pNext->plChild;}else{pCur->plChild = pNext->plChild;}delete(pNext);}return true;
}

建树容易拆树难

删除结点的时候要考虑到4种情况:

1:删除结点左右子树均为空

2:删除结点左子树为空

3:删除结点右子树为空

4:删除结点左右子树均不为空

  相关解决方案