严蔚敏《数据结构》习题(五)
6.38 同6.37题条件,写出后序遍历的非递归算法。
Status PostOrder(BiTree T){
if(!T) return ERROR;
InitStack(S);//初始化栈
Push(S);//根压栈
p = T;
while(p || !StackEmpty(S)){
if(p){
Push(S,p);
p = p->lchild;
}
else{
p = GetTop(S);
if(p->rchild && p->rchild != r) p = p->rchild;
else{
Pop(S,p);
visit(p->data);
r = p;
p = NULL;
}
}
}
return OK;
}
6.42 编写递归算法,计算二叉树中叶子结点的数目。
int n = 0;
Status BiTreeLeaf(BiTree T){
//计数器为全局变量
if(T){
if(T->lchild) BiTreeLeaf(T->lchild);
if(T->rchild) BiTreeLeaf(T->rchild);
if(!T->lchild && !T->rchild) n++:
}
return OK;
}
6.43 编写递归算法,将二叉树中所有结点的左、右子树相互交换。
Status BiTreeChange(BiTree &T){
//T空报错
if(!T) return ERROR;
p = T->lchild;
T->lchild = T->rchild;
T->rchild = p;
BiTreeChange(T->lchild);
BiTreeChange(T->rchild);
return OK;
}
6.48 已知在二叉树中,* root为根结点,* p和* q为二叉树中两个结点,试编写求距离它们最近的共同祖先的算法。
BiTree Near_Ancestor(BiTree root,BiTree p,BiTree q) {
if(root == NULL) return NULL;
if(root == p || root == q) return root;
left = Near_Ancestor(root->lchild,p,q);
right = Near_Ancestor(root->rchild,p,q);
if(left != NULL && right != NULL)
return root; //pq分别在root左右子树,root自然为共同最近祖先
else if(left != NULL) return left;//都在左子树
else if(right != NULL) return right;//都在右子树
else return NULL;
}
6.55 为二叉链表的结点增加DescNum域。试写一算法,求二叉树的每个结点的子孙数目并存入其DescNum域。请给出算法的时间复杂度。
int BiTree_DescNum(BiTree &T){
if(!T) return -1;
else
num = BiTree_DescNum(T->lchild) + BiTree_DescNum(T->rchild) + 2;
T->DescNum = num;
return num;
}
时间复杂度为O(n)
,其中n为结点数目。