[算法与数据结构]-查找完全二叉树的最后一个节点

题意

查找完全二叉树的最后一个节点指的就是查找完全二叉树中叶子节点层的最后一个节点,如下图所示:
在这里插入图片描述

做法

既然是完全二叉树,那么如果能够使用队列,进行层次遍历,肯定可以解决问题。但本题在做的时候并没有提供队列的 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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值