题目:
设data 域为正整数,该二叉树树根结点地址为T。 现给出一个正整数x。请编写非递归程序,实现将data域的值小于等于x的结点全部删除掉。
data: 给出结点数据的值;left: 给出本结点的左儿子结点的地址;right
代码:
typedef struct node {
int data;
struct node *left,*right;
}BiTNode,*BSTree;
void DelTree(BSTree r){
//非递归删除以r为根的二叉排序树
BSTree S[]; // 栈,容量足够大,栈中元素是二叉排序树结点的指针
int 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);
}
}
}
//在二叉排序树T中,删除所有小于等于x的结点
void DeleteAllx(BSTree T,intx){
BSTree p=T,q;
while(T && T->data≤x){ //根结点的值小于等于x
p=T;
T=T->right;
p->right=null;
free(p); //删除二叉树p,删除持续到“根”结点值大于x或T为空树为止
}
if (T){
q=T;
p=T->left;
while(p && p->data>x){ //沿根结点左分枝向下,查小于等于x的结点
while(p && p->data>x){ // q记p的双亲
q=p;
p=p->left;
}
if(p) { //p结点的值小于等于x
q->left=p->right;
p->right=null;
free(p);
}
p=q->left; // 再查原p的右子树中小于等于x的结点
}
}
}