1.设计算法返回二叉树T中先序遍历的最后一个结点,非递归方式
BTree prelast(BTree T){
BTree p=T;
while(p->child!=NULL&&p->rchild!=NULL){ //当前结点有孩子就循环(先序遍历的最后一个结点一定为叶子结点) ,非叶子结点肯定不是最后一个结点
if(p->rchild){ //如果有右孩子,右孩子肯定在先序序列中当前节点之后(如果再有左孩子,右孩子也在整个左子树之后)
p=p->rchild;
}
else //如果无右孩子,则肯定有左孩子,左孩子肯定在先序序列中当前节点之后,向左孩子移动
p=p->lchild;
}
return p;
}
2.设计算法按照先序遍历方式输出二叉树T的每个结点和其层次数
int count=1; //全局变量
BTree preorder(BTree T,int count){
BTree p=T;
if(T!=NULL){ //T不为空,继续执行,T为空,结束此次递归
print("%c,%d",p->data,count); //输出当前结点和当前层次数
preorder(p->lchild,count+1); //输出其左子树每个结点及其层次数
preorder(p->rchild,count+1); //输出其右子树每个结点及其层次数
}
}
3.一颗完全二叉树以顺序方式存储在A[1..n]中,设计算法转换为二叉链表形式
BTree build(int A[],int i,int n){
BTree r;
if(i>n) return NULL; //位置超出存储区域,算法结束
else
{
r=(BTree)malloc(sizeof(BNode)); //为新结点分配存储空间
r->data=A[i]; //获得i位置的数据
r->lchild=build(A,2*i,n); //建立当前结点的左子树
r->rchild=build(A,2*i+1,n); //建立当前结点的右子树
return r;
}
}
4.设计算法将一颗二叉链表形式的二叉树按顺序方式存储到数组A[]中
void trans(BTree T,int i){
if(T!=NULL){
A[i]=T->data; //存储当前结点
trans(T->lchild,2*i); //存储当前结点的左子树
trans(T->rchild,2*i+1); //存储当前结点的右子树
}
}
5.设计算法交换二叉树中每个结点的左右孩子
void swap(BTree &T){
BTree temp;
if(T!=NULL){
temp=T->lchild; //交换左右孩子
T->lchild=T->rchild;
T->lchild=temp;
swap(T->lchild); //递归对左子树右子树进行同样操作
swap(T->rchild);
}
}