『壹』 二叉搜索树怎么删除节点 如图 如果要把节点8删除,要怎么删

通常不会从二叉搜索树中删除某个结点。即使要删除,删除的方法也不是唯一的。当被删除的结点p是叶子结点时无需多言;当不是叶子结点时,介绍其中一种方法:
若p有左孩子,递归查找p的左子树的最右结点,用其替代p。若该节点存在左孩子,将左孩子顶替到该节点位置上。
若p没有左孩子,直接用右孩子代替该节点。
要删除图中的8,首先递归查找其左子树的最右结点,为7。将7顶替到8的位置上,并删除结点8。结点7没有左孩子,操作完成。

『贰』 查找二叉树怎么删除节点

怎么又是你,我给你的代码没认真看么?那是二叉树函数库,一并具全。
searchtree delete(int
x,searchtree t)删除指定结点函数。你看着我给你的代码有这个东西没有。调用的时候delete(结点,树指针);就这样。二叉树和c语言都很复习,要认真研究。还有二叉树不就是二叉查找树吗?(多了查找功能罢了)。我怀疑我给你的代码都没看完,这个不能心急,我研究二叉树都花了几天时间,没有耐性不行的。

『叁』 二叉排序树的插入删除

与次优二叉树相对,二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。

『肆』 二叉排序树的节点删除

p的双亲节点还是指向的p的地址,这没错,
因为p=p->lchild是把p指向p的左孩子的地址,所以p的双亲结点指向的p就是指到了删除前p的左孩子结点,然后用free(q)释放了p的内存,就完成了重接左子树

『伍』 二叉查找树的查找、插入与删除操作。

#include "BiSearchTree.h"

void main(void){
BiSearchTree<int>searchTree;
int a[]={18,14,24,5,16,20,38,7,30,10,35},n=11;
for(int i=0;i<n;i++)
searchTree.Insert(a[i]);
searchTree.PrintVTree();
cout<<endl;
cout<<"非递归前序遍历:"<<endl;
searchTree.PreOrder();
cout<<endl;
cout<<"非递归后序遍历:"<<endl;
searchTree.PostOrder();
cout<<endl;
cout<<" 删除24";
searchTree.Delete(a[2]);
searchTree.PrintVTree();
cout<<endl;
}
//BiSearchTree.h
#include "LinStack.h"
#include<math.h>

struct Info{
int xIndent;
int yLevel;
};
template<typename T>class BiSearchTree{
private:
BiTreeNode<T> *root;
void PreOrder(BiTreeNode<T> *&t);
void InOrder(BiTreeNode<T> *&t);
void PostOrder(BiTreeNode<T> *&t);
void Insert(BiTreeNode<T> *&ptr,const T &item);
void Delete(BiTreeNode<T> *&ptr,const T &item);
void PrintVTree(BiTreeNode<T> *&t);
public:
BiSearchTree():root(NULL){};
~BiSearchTree(){};

void PrintVTree(){PrintVTree(root);}
BiTreeNode<T> *&GetRoot(){return root;}
void PreOrder(){ PreOrder(root);}
void PostOrder(){ PostOrder(root);}
BiTreeNode<T> *&Find(const T &item);
void Insert(const T &item){
Insert(GetRoot(),item);}
void Delete(const T &item){
Delete(GetRoot(),item);}
};
template<typename T>void BiSearchTree<T>::PrintVTree(BiTreeNode<T> *&t){
int screenWidth=64;
int dataWidth=2;
LinQueue<Info> QI;
LinQueue<BiTreeNode<T>*> Q;
BiTreeNode<T> *p;
Info s,s1,s2;
int offset,level=-1,len,i;
Q.Insert(t);
s.xIndent=screenWidth/dataWidth;
s.yLevel=0;
QI.Insert(s);
while(!Q.Empty()&&!QI.Empty())
{
s2=s;
p=Q.Delete();
s=QI.Delete();
if(s.yLevel!=level){
cout<<"\n第"<<s.yLevel<<"层";
level=s.yLevel;

提供网站http://www.bc-cn.net/bbs/Article/20054/16/15813.html
如果有不会的可以问我,小弟对这个略知一,二.

『陆』 关于搜索二叉树删除操作的问题

建议你重新学习汇编语言,用单步调试的方法进行调试你就明白了,眼过前行不如手撸一行

『柒』 java,二叉搜索树中的删除节点

这里完全可以。

习惯上应该是上面的写法,要在successor结点更改之前就进行赋值,在有些情况下能够防止出现错误赋值,或者是,节省算法的复杂度。

不过,显然这里没什么影响。

『捌』 二叉排序树 删除结点 定义

二叉排序树节点的删除有2种方法
你上面我没有看懂你的
但是我讲的你肯定能听懂
假设要删除的是节点p,pl为p的左子树pr为p的右子树
a:前驱后继法
首先中序遍历二叉树得到一个序列你的例子是51 20 48 89 112 56 得到89的后继是112,前驱是48.
这下就证明书上的没有错了。这里我用后继的方法用112替代根节点,此时原来根节点的左子树仍要满足二叉排序树的性质,所以要接在112的后面。
总的来说就是删除一个节点p,用前驱(后继)取代p,而前驱(后继)的右子树就取代p的位置(!!此时后继没有左子树,因为假如后继有左子树的话那么后继就是p的左子树了啊,而不是p要是存在左右子树的话,那么后继的兄弟右子树就不要变动了)p的子树不变位置,依然接在新的节点后面,作为其左右子树。
b:左右子树替代法
删除节点p,我这里用左子树法,首先用48取代89,那么89的右子树(包含112 56)就接在新的节点48后面作为其右子树,依然满足二叉排序树的特征。
总的来说,删除节点p,用它的右(左)子树替代节点p,然后将p的左(右)子树作为p左(右)子树的接在右(左)子树的最左(右)节点后面作为左(右)子树即可。你这个例子用右子树替代的话,最左节点是56。
我是个学生,以后多多交流,我的QQ是314251898
谢谢。

『玖』 二叉排序树的删除一个节点的为码算法

bool Delete_Node(Tree& T,char key);删除二叉树中值为key的节点如果树中不含有对应节点返回fals否则返回true;算法如下
{
首先在循环中查找到值为key的节点,如果找不到,返回false,找到则跳出循环
如果找到的是根节点,则直接把根的左子树放到右子树最左边
根节点的值为改为右子树即可
如果不是根节点,首先找到这个节点对应右子树的最左节点,然后把左子树接过去,接下来把这个节点的根节点的左子树或是右子树指向这个节点的右子树
}

『拾』 java 二叉查找树删除

这里完全可以。

习惯上应该是上面的写法,要在successor结点更改之前就进行赋值,在有些情况下能够防止出现错误赋值,或者是,节省算法的复杂度。

不过,显然这里没什么影响。