题目一
写出在中序线索二叉树中结点p的右子树中插入一个结点s的算法
代码
void insert(BiThrNode p,BiThrNode s)
{
BiThrNode *p,*s;
if(p->rtag==1) //无右子树,则有右线索
{
s->rchild=p->rchild;
s->rtag=1;
p->rchild=s;
p->rtag=0;
}
else
{
q=p->rchild;
while(q->ltag==0)//查找p所指结点中序后继,即右子树中最左下的结点
q=q->lchild;
q->lchild=p->rchild;
s->rtag=0;
p->rchild=s;
}
s->lchild=p;
s->ltag=1;
}
题目二
给出二叉树自下而上,从右到左的层次遍历算法
思想
就是利用了原有的层次遍历算法,将所有遍历的结点入栈,然后弹栈。利用了栈颠倒次序的特点
原有的层次遍历算法是自上而下、从左到右,这里遍历算法恰恰相反。利用原有的层次遍历算法,出队的同时将各节点指针入栈,在所有结点入栈后再从栈顶开始一次访问
具体实现
1、根结点入队
2、一个元素出队列,遍历元素
3、依次把这个元素的右孩子、左孩子入队
4、若队列不空调到2,否则结束
代码
void InvertLevel(BiTree bt){
Stack s;
Queue Q;
if(bt!=null)
{
InitStack(s); //初始化栈,栈中存放二叉树结点的指针
InitQueue(Q);
EnQueue(Q,bt);
while(IsEmpty(Q)==false){
DeQueue(Q,p);
Push(s,p); //出队入栈
if(p->lchild)
EnQueue(Q,p->lchild); //左不空,入队
if(p->rchild)
EnQueue(Q,p->rchild);
}
while(Isempty(s)==false){
Pop(s,p);
visit(p->data);
}
}
}
#define MAX_NODE 50
void levelorderTraverse(BTNode *T)
{
//基础层次遍历
BTNode *Queue[MAX_NODE],*p=T;
int front=0,rear=0;
if(T==NULL)
printf("Empty");
else{
Queue[++rear]=p;
while(front<rear){
p=Queue[++front];
visit(p->data);
if(p->Lchild!=NULL)
Queue[++rear]=p->Lchild;
if(p->Rchild!=NULL)
Queue[++rear]=p->Rchild;
}
}
}