C++之《剑指offer》学习记录(12):二叉树的下一个节点
笔者最近在找工作时,无意间读到了一本名为《剑指offer》的书,粗略翻阅了一下,感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程,希望能和这本书的读者朋友们一起交流学习心得。
介绍:《剑指Offer:名企面试官精讲典型编程题(第2版)》剖析了80个典型的编程面试题,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。
编程题链接:牛客网在线编程_算法面试_面试必刷TOP101 (nowcoder.com)
本博客关键词:二叉树的下一个节点
题设
给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。
本人解法:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if (pNode == nullptr) {
return nullptr;
}
TreeLinkNode* p = pNode;
// 根节点
if (pNode->next == nullptr) {
if (pNode->right == nullptr) {
return nullptr;
}
p = pNode->right;
while (p->left != nullptr) {
p = p->left;
}
return p;
}
// 非根节点
else {
// 父节点的左子节点
if (pNode == pNode->next->left) {
// 无右子节点
if (pNode->right == nullptr) {
return pNode->next;
}
// 有右子节点
else {
p = pNode->right;
while (p->left != nullptr) {
p = p->left;
}
return p;
}
}
// 父节点的右子节点
else {
// 无右子节点
if (pNode->right == nullptr) {
while (p->next->next != nullptr) {
p = p->next;
}
if (p == p->next->left) {
return p->next;
} else {
return nullptr;
}
}
// 有右子节点
else {
p = pNode->right;
while (p->left != nullptr) {
p = p->left;
}
return p;
}
}
}
}
};
官方解法:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if (pNode == nullptr) {
return nullptr;
}
TreeLinkNode* pNext = nullptr;
if (pNode->right != nullptr) {
TreeLinkNode* p = pNode->right;
while (p->left != nullptr) {
p = p->left;
}
pNext = p;
} else if (pNode->next != nullptr) {
TreeLinkNode* pCur = pNode;
TreeLinkNode* pPar = pNode->next;
while (pPar != nullptr && pCur == pPar->right) {
pCur = pPar;
pPar = pPar->next;
}
pNext = pPar;
}
return pNext;
}
};
我的解法思路和官方的是差不多的,都是分类讨论然后遍历。