题目: 设排序二叉树中结点的结构为下述三个域构成:
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
处理没有问题
声音太好听
快去操谢作死家的女人去
好可爱