CodeTop:补充题 12. 二叉树的下一个结点
牛客网:[编程题]二叉树的下一个结点
题目
给定二叉树其中的一个结点,请找出其中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,而且包含指向父结点的指针。
示例:
输入:{8,6,10,5,7,9,11},8
输出:9
输入:{8,6,10,5,7,9,11},6
输出:7
输入:{5},5
输出:5
解答 & 代码
节点 pNode
的中序遍历的下一个结点有 3 种可能:
- 若
pNode
有右子树,则其中序遍历的下一个节点为其右子树的最左节点。eg. 上图 2 的中序遍历的下一个结点为 8 若
pNode
没有右子树- 若
pNode
是其父节点的左孩子,则pNode
的父节点就是pNode
中序遍历的下一个结点。eg. 上图 7 的中序遍历的下一个结点为 4 若
pNode
是其父节点的有孩子,则沿着父节点往上,直到找到一个节点的父节点的左孩子是该节点,则该节点的父节点就是pNode
中序遍历的下一个结点。eg. 上图 9 的中序遍历的下一个结点为 1/*
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;
// 1. 若 pNode 有右子树,则其中序遍历的下一个节点为其右子树的最左节点
if(pNode->right != nullptr)
{
TreeLinkNode* next = pNode->right;
while(next->left != nullptr)
next = next->left;
return next;
}
// 2. 若 pNode 没有右子树
// 2.1 若 pNode 是其父节点的左孩子,则 pNode 的父节点就是 pNode 中序遍历的下一个结点
else if(pNode->next != nullptr && pNode->next->left == pNode)
return pNode->next;
// 2.2 若 pNode 是其父节点的有孩子,则沿着父节点往上,直到找到一个节点的父节点的左孩子
// 是该节点,则该节点的父节点就是 pNode 中序遍历的下一个结点
else if(pNode->next != nullptr && pNode->next->right == pNode)
{
TreeLinkNode* next = pNode->next;
while(next->next != nullptr && next->next->left != next)
next = next->next;
return next->next;
}
else
return nullptr;
}
};
复杂度分析:设二叉树节点数为 N
- 若
- 时间复杂度 O(log N):即二叉树的深度
- 空间复杂度 O(1):
执行结果:
执行结果:通过
执行用时:5 ms
内存消耗:540 KB