b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c 二叉排序树 请教一道数据结构考研水平的二叉排序树题目?

电脑杂谈  发布时间:2017-02-20 16:00:44  来源:网络整理

题目: 设排序二叉树中结点的结构为下述三个域构成:

data: 给出结点数据的值;left: 给出本结点的左儿子结点的地址;right: 给出本结点的右儿子结点的地址

设data 域为正整数,该二叉树树根结点地址为T。 现给出一个正整数x。请编写非递归程序,实现将data域的值小于等于x的结点全部删除掉。c 二叉排序树

下方是答案给的代码,它的具体思路我懂,很清晰,但无奈小弟喜钻牛角尖,有个地方实在疑问,感觉是有错误但自己又无法清晰用代码描述出来,水平有限,特来请教。问题就是下方注释处有两个笑脸的while嵌套语句处,假设如图这种情况,p不满足外面while的循环,也就进不去里面的循环,也就无法继续往右孩子走查找998继而查找997,如果第一次循环进去了那他就可以针对小于或大于而进行查找,它第一次循环不满足条件的话那不达不到这算法的目的了吗。c 二叉排序树然后我想自己给它描述出来,可小弟c学的实在马马虎虎,想if又想while的给绕的脑子短路了。还请帮助,打扰各位一会思考时间,多谢!

答案代码:

typedef struct node {int data; struct node *left,*right;

}BiTNode,*BSTree;

void DelTree(BSTree r)

//非递归删除以r为根的二叉排序树

{BSTree S[];// 栈,容量足够大,栈中元素是二叉排序树结点的指针

top=0;

while (r!=null || top>0)

{while(r!=null) // 沿左分枝向下

{S[++top]=r;r=r->left ;}

if(top>0) // 退栈,沿栈顶结点的右子树向下删除,释放被删除结点空间

{p=S[top--];r=p->right;free(p);}

}

}// DelTree

void DeleteAllx(BSTree T,intx)

//在二叉排序树T中,删除所有小于等于x的结点

{BSTree p=T,q;

while(T && T->data≤x) //根结点的值小于等于x

{p=T;T=T->right;p->right=null;

DelTree(p);} //删除二叉树p,删除持续到“根”结点值大于x或T为空树为止

if (T)

{q=T;p=T->left;

while(p && p->data>x) //沿根结点左分枝向下,查小于等于x的结点^_^^_^

{while(p && p->data>x) { q=p;p=p->left;} // q记p的双亲

if(p) //p结点的值小于等于x

{q->left=p->right;p->right=null;DelTree(p); }

p=q->left;// 再查原p的右子树中小于等于x的结点

}}

}// DeleteAllx


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33503-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...