点击上方“Jerry的算法和NLP”,选择“星标”公众号
重磅干货,第一时间送达
题目
二叉树的下一个节点
题目要求
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路
分析二叉树的下一个节点,一共有以下情况:
1.二叉树为空,则返回空;
2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;
(如图中A节点的中序遍历的下一个节点就是F)
3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;
(如图中D的下一个节点就是B)
否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。
(如图中E节点是B节点的右孩子,不满足情况,故往上查询是否存在左孩子的情况,结果为A)
Python :
class Solution:
def GetNext(self, pNode):
# write code here
if pNode.right:#有右子树
p=pNode.right
while p.left:
p=p.left
return p
while pNode.next:#无右子树,则找第一个当前节点是父节点左孩子的节点
if(pNode.next.left==pNode):
return pNode.next
pNode = pNode.next#沿着父节点向上遍历
return #到了根节点仍没找到,则返回空
C++
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
// 特殊输入
if(pNode == nullptr)
return nullptr;
/* 寻找结果 */
// 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点
// 如果节点无右子节点,但该节点是其父节点的左子节点,则父节点是该节点的下一个节点
// 如果节点无右子节点,且该节点是其父节点的右子节点,则沿着父节点向上遍历,满足XXX的父节点是其该节点的下一个节点
TreeLinkNode * res = nullptr;
if(pNode->right != nullptr)
{
TreeLinkNode* node_right = pNode->right;
while(node_right ->left != nullptr)
{
node_right = node_right->left;
}
res = node_right;
}
else if(pNode->next != nullptr)
{
// 当前节点和当前节点的父节点
TreeLinkNode * current = pNode;
TreeLinkNode * parent = pNode->next;
while(parent!=nullptr && current == parent->right)
{
current = parent;
parent = parent ->next;
}
res = parent;
}
return res;
}
};
JAVA
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL)
return NULL;
if(pNode->right!=NULL)
{
pNode=pNode->right;
while(pNode->left!=NULL)
pNode=pNode->left;
return pNode;
}
while(pNode->next!=NULL)
{
TreeLinkNode *proot=pNode->next;
if(proot->left==pNode)
return proot;
pNode=pNode->next;
}
return NULL;
}
};
后记
注:面试季来了,不管是作为面试者还是以后作为面试官,了解算法这门程序员之间的沟通方式都是非常必要的。找过工作的朋友应该都听说过《剑指offer》,虽然书中只有六十多道题目,但是道道都是经典。
如果是单纯的面试需求,剑指offer的优先级肯定是在Leetcode之前,总的说它有三个优点:
1.很可能在面试中出现原题
2.约66题,题量少,但是涵盖的内容较全
3.能培养一个良好的刷题习惯
它的缺点是:
1.只有66题,刷着容易过拟合
2.动态规划的题比较少,因此需要在Leetcode上专项训练。
算法题主要分成数据结构和具体算法部分,简单归类如下。基本每道题都很精彩,所以这里就不一一洗写了,题解可以看看我的代码仓库或者讨论区的内容。
数据结构类题目
LinkedList
Tree
004-重建二叉树
017-树的子结构
018-二叉树的镜像
022-从上往下打印二叉树
023-二叉搜索树的后序遍历序列
024-二叉树中和为某一值的路径
026-二叉搜索树与双向链表
038-二叉树的深度
039-平衡二叉树
057-二叉树的下一个结点
058-对称的二叉树
059-按之字形顺序打印二叉树
060-把二叉树打印成多行
061-序列化二叉树
062-二叉搜索树的第k个结点
Stack & Queue
005-用两个栈实现队列
020-包含min函数的栈
021-栈的压入、弹出序列
044-翻转单词顺序列(栈)
064-滑动窗口的最大值(双端队列)
Heap
029-最小的K个数
Hash Table
034-第一个只出现一次的字符
图
065-矩阵中的路径(BFS)
066-机器人的运动范围(DFS)
具体算法类题目
斐波那契数列
007-斐波拉契数列
008-跳台阶
009-变态跳台阶
010-矩形覆盖
搜索算法
006-旋转数组的最小数字(二分查找)
037-数字在排序数组中出现的次数(二分查找)
全排列
027-字符串的排列
动态规划
030-连续子数组的最大和
052-正则表达式匹配(我用的暴力)
回溯
065-矩阵中的路径(BFS)
066-机器人的运动范围(DFS)
排序
035-数组中的逆序对(归并排序)
029-最小的K个数(堆排序)
029-最小的K个数(快速排序)
位运算
011-二进制中1的个数
012-数值的整数次方
其他算法
002-替换空格
013-调整数组顺序使奇数位于偶数前面
028-数组中出现次数超过一半的数字
031-整数中1出现的次数(从1到n整数中1出现的次数)
032-把数组排成最小的数
033-丑数
041-和为S的连续正数序列(滑动窗口思想)
042-和为S的两个数字(双指针思想)
043-左旋转字符串(矩阵翻转)
046-孩子们的游戏-圆圈中最后剩下的数(约瑟夫环)
剑指offer刷题交流群
扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆),只有备注正确才可以加群噢。
▲长按加群