题意
查找完全二叉树的最后一个节点指的就是查找完全二叉树中叶子节点层的最后一个节点,如下图所示:
做法
既然是完全二叉树,那么如果能够使用队列,进行层次遍历,肯定可以解决问题。但本题在做的时候并没有提供队列的 API。所以只使用了二叉树的基本操作:
基于先序遍历,同时维护当前遍历到的是第几层,那么最大层数的最后一个节点就是我们要找的节点。由于是先序遍历,所以最后一个被遍历到的节点一定就是最后一层的节点,且是这最后一层的最后一个节点,所以我们只需要依次记录当前遍历到的节点的索引,当遍历结束时,借助这个索引找到的对应的节点就是要返回的答案
void getNode(BiTree T,int lay,TElemType nodeInf[][100] ,int *layer,int* num){
if(T == NULL) return;
if(T->lchild == NULL && T->rchild == NULL){
//如果layer被赋值过了,那layer就是当前已经遍历过的所有节点中最大层数,所以如果当前所在层数小于layer,那就没必要
//处理了,因为最后一个节点一定出现在最下面一层也即是层数最大那一层
if(lay < *layer) return;
nodeInf[lay][++(*num)] = T->data;
*layer = lay > *layer ? lay : *layer;
return;
}
getNode(T->lchild,lay + 1,nodeInf,layer,num);
getNode(T->rchild,lay + 1,nodeInf,layer,num);
}
//=============顶层提供调用的函数=====================//
BiTNode* getLastNode(BiTree T)
/* 求完全二叉树的最后一层的最后一个结点 */
{
//用一个数组记录遍历到的每一个叶子节点,nodeInf[所在层数][num]=节点的值
TElemType nodeInf[100][100] = {'P'};
int layer = -1;
int num = -1;
//根节点层数为1,传入lay为1
getNode(T,1,nodeInf,&layer,&num);
//如果layer没有改变过,说明为空树,返回NULL
if(layer == -1){
return NULL;
}
BiTree temp = (BiTree)malloc(sizeof(BiTNode));
//由于采用的是先序遍历,而且当遍历过层数最大那一层后其它层的节点不会再遍历到,所以
//可以发现num到最后对应的一定是我们要找的那个最后一个节点,看似对num没有特殊处理,
//需要举几个样例代进去就能看出来
temp->data = nodeInf[layer][num];
temp->lchild = NULL;
temp->rchild = NULL;
return temp;
}