算法题——完全二叉树的底层最右节点
题目:给定一棵完全二叉树,返回最后一层的最右边的节点。
思路:
- 层次遍历,用一个last变量记录每次出队列的值,遍历结束之后last变量记录的就是所求节点。时间、空间复杂度都是O(N)。
- 递归,求子树的高度:如果当前根节点为叶子节点,则返回;如果左子树高度>右子树高度,则在左子树继续递归过程;否则在右子树继续递归。由于是完全二叉树,求高度时只需一直往左遍历即可。每次递归都下降一层,每次都求树的高度,时间复杂度为O(lgN * lgN)。
代码:
1 递归版:
1 TreeNode *getLastNode(TreeNode *root)
2 {
3 if(root == NULL || root->left == NULL) //递归出口,如果根为空,或者根为叶子节点。完全二叉树只需判定左儿子是否为空即可判定是否为叶子节点
4 return root;
5
6 int lh = 0; //左子树高度
7 TreeNode *ptn = root->left;
8 while(ptn != NULL)
9 {
10 ++lh;
11 ptn = ptn->left;
12 }
13
14 int rh = 0; //右子树高度
15 ptn = root->right;
16 while(ptn != NULL)
17 {
18 ++rh;
19 ptn = ptn->left;
20 }
21
22 if(lh > rh)
23 return getLastNode(root->left);
24 else
25 return getLastNode(root->right);
26 }
2 迭代版:
TreeNode *getLastNode(TreeNode *root)
{
if(root == NULL)
return NULL;
int height = 0; //先求树的高度
TreeNode *ptn = root->left;
while(ptn != NULL)
{
++height;
ptn = ptn->left;
}
TreeNode *last = root;
while(last->left != NULL) //指向叶节点时退出
{
int lh = --height; //左子树的高度必然是父亲树高度-1
int rh = 0;
ptn = last->right;
while(ptn != NULL)
{
++rh;
ptn = ptn->left;
}
if(lh > rh)
last = last->left;
else
last = last->right;
}
return last;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端