问答题 从键盘上输入一串正整数,最后输入一1作为结束标志。如:8,7,1,22,98,46,…,75,一1。请设计一个非递归程序,创建一棵二叉排序树,并且该二叉排序树也必须是中序线索二叉树。设该二叉排序树上的结点结构为:
【正确答案】正确答案:二叉排序树建立过程如下:设输入第一个数据,用二叉排序树根结点指针bst指向该结点,根结点的数据域赋值。将左右子女指针和左右标记初始化:bst一>left=-bst一>right=null,bst一>ltag=bst一>nag=1。接着对输入数据做如下处理:若该数据小于根结点的数据,则在左子树上查找其插入位置,否则在右子树上查找其插入位置。查找时记住其双亲结点的指针厂。插入的结点一定是叶子,设p指向已申请空间的叶子结点。若p一>data<f->data,则按f的左子女插入,否则,按f的右子女插入,同时,修改双亲和叶子的线索和标记。核心语句段如下: cin>>x; //输入数据 while(x!=flag) //flag是结束标记 {if(bst==null) //处理根结点 {bst=new(BstNode); //建立根结点,并初始化 bst一>left=bst一>right=null ;bst->itag=bst->rtag=1;bst->data=x; } else //非根结点的插入 {f=null;s=bst ; //f是双亲指针 while(s) {if(s一>data>x){f=s ; s=s一>left;} //沿左分支向下 else if(S->dataright;} //沿右分支向下 else{tout<<“输入数据不允许重复”<data=x; //申请结点空间,填入数据 if(f一>data>x) //插入为左子女 {p一>left=f一>left;f一>left=p;f一>ltag=0; //修改双亲线索和标记 p->itag=p->rtag=l;p->right=f; //建立叶子结点的线索和标记 } else //插入为右子女 {p一>right=f一>right;f->right=p;f一>rtag=0; P一>Itag=p一>rtag=l;P一>left=f; } cin>>x; //输入数据 } //else结束非根结点的插入 } //结束while(x!=flag)
【答案解析】