LeetCode 剑指 Offer 08. 二叉树的下一个节点
1.LeetCode 剑指 Offer 03. 数组中重复的数字2.LeetCode 剑指 Offer 04. 二维数组中的查找
3.LeetCode 剑指 Offer 08. 二叉树的下一个节点
4.LeetCode 剑指 Offer 12. 矩阵中的路径5.LeetCode 剑指 Offer 11. 旋转数组的最小数字6.LeetCode 剑指 Offer 13. 机器人的运动范围7.剑指Offe 14- I. 剪绳子8.剑指Offer 14- II. 剪绳子 II9.剑指Offer 15. 二进制中1的个数10.剑指Offer 16. 数值的整数次方11.剑指Offer 17. 打印从1到最大的n位数12.剑指Offer 18. 删除链表的节点13.剑指Offer 20. 表示数值的字符串14.剑指Offer 21. 调整数组顺序使奇数位于偶数前面15.剑指Offer 22. 链表中倒数第k个节点16.剑指Offer 25. 合并两个排序的链表17.剑指Offer 26. 树的子结构18.剑指Offer 27. 二叉树的镜像19.剑指Offer 28. 对称的二叉树20.剑指Offer 29. 顺时针打印矩阵21.剑指Offer 30. 包含min函数的栈22.剑指Offer 31. 栈的压入、弹出序列23.剑指Offer 32 - I. 从上到下打印二叉树24.剑指Offer 32 - II. 从上到下打印二叉树 II25.剑指Offer 32 - III. 从上到下打印二叉树26.剑指Offer 33. 二叉搜索树的后序遍历序列27.剑指Offer 34. 二叉树中和为某一值的路径28.剑指Offer 35. 复杂链表的复制29.剑指Offer 42. 连续子数组的最大和30.剑指Offer 45. 把数组排成最小的数31.剑指Offer 32.剑指Offer 43. 1~n 整数中 1 出现的次数33.剑指 Offer 46. 把数字翻译成字符串34.剑指 Offer 47. 礼物的最大价值35.剑指Offer 48. 最长不含重复字符的子字符串36.剑指 Offer 49. 丑数37.剑指 Offer 50. 第一个只出现一次的字符38.剑指 Offer 51. 数组中的逆序对39.剑指 Offer 52. 两个链表的第一个公共节点40.剑指 Offer 53 - I. 在排序数组中查找数字 I41.剑指 Offer 53 - II. 0~n-1中缺失的数字42.剑指 Offer 54. 二叉搜索树的第k大节点43.剑指 Offer 55 - I. 二叉树的深度44.剑指 Offer 55 - II. 平衡二叉树45.剑指 Offer 56 - I. 数组中数字出现的次数46.剑指 Offer 57 - II. 和为s的连续正数序列47.剑指 Offer 56 - II. 数组中数字出现的次数 II48.剑指 Offer 58 - II. 左旋转字符串49.剑指 Offer 59 - I. 滑动窗口的最大值50.剑指 Offer 60. n个骰子的点数51.剑指 Offer 61. 扑克牌中的顺子52.剑指 Offer 62. 圆圈中最后剩下的数字53.剑指 Offer 63. 股票的最大利润54.剑指 Offer 64. 求1+2+…+n55.剑指 Offer 65. 不用加减乘除做加法56.剑指 Offer 66. 构建乘积数组57.剑指 Offer 67. 把字符串转换成整数58.剑指 Offer 68 - I. 二叉搜索树的最近公共祖先59.剑指 Offer 68 - II. 二叉树的最近公共祖先题目:二叉树的下一个节点
给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。(树的后继)
注意:
- 如果给定的节点是中序遍历序列的最后一个,则返回空节点;
- 二叉树一定不为空,且给定的节点一定不是空节点;
解题思路
二叉树的中序遍历:{ [左子树], 根节点, [右子树] }
如图所示二叉树的中序遍历:D, B, H, E, I, A, F, C, G
分三种情况:
-
如果该节点有右子树,那么下一个节点就是其右子树中最左边的节点;
-
如果该节点没有右子树,且是其父节点的左子节点,那么下一个节点就是其父节点;
-
如果该节点没有右子树,且是其父节点的右子节点,沿着父指针一直向上,直到找到一个是它父节点的左子节点的节点,如果这样的节点存在,那么这个节点的父节点即是所求。
例如:
-
情况 1:图中节点 B 的下一个节点是节点 H;
-
情况 2:图中节点 H 的下一个节点是节点 E;
-
情况 3:图中节点 I 的下一个节点是节点 A。
时空复杂度:O(height),其中 height 是二叉树的高度, 空间复杂度:O(1)
func inorderSuccessor(p *TreeNode) *TreeNode {
//右子树存在 右子树最左边的结点
if(p.Right != nil){
p = p.Right
for(p.Left != nil){
p = p.Left
}
return p
}
//右子树不存在 只有左子树
for(p.Father != nil){
//p不是根节点
if(p == p.Father.Left) { //如果是父节点的左子树
return p.Father //返回父节点
}
p = p.Father //继续往上找
}
return nil
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!