面试题8:二叉树的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
重点搞清楚思路:根据中序序列 左中右 考虑,指定节点下一个节点与右子树节点密切相关。
若节点有右子树,则下一个节点即为该右子树的最左节点;
若节点无右子树但有父节点,则沿着父节点一直向上遍历,直到找到一个节点,它是其父节点的左子节点;
若不满足以上两种情况,则无下一个节点。
代码:TreeLinkNode* GetNext(TreeLinkNode* pNode) { if (pNode == nullptr) return NULL; //若节点有右子树,则下一个节点是其右子树的最左侧节点 if (pNode->right) { TreeLinkNode* leftNode = pNode->right; while (leftNode->left) { leftNode = leftNode->left; } return leftNode; } //若节点没有右子树且有父节点 else if(pNode->next!=nullptr) { TreeLinkNode* parentNode = pNode->next; //若节点是其父节点的左子节点,则下一个节点为其父节点 if (pNode == parentNode->left) { return parentNode; } //若节点是其父节点的右子节点,这种情况就比较麻烦。我们沿着指向父节点的指针一直向上,一直找到一个节点是其父节点的左子节点,其父节点就是我们要找的节点 else { while (parentNode!=nullptr&& parentNode->next!=nullptr&&parentNode!=parentNode->next->left) { parentNode = parentNode->next; } return parentNode->next; } } //若节点无右子树且无父节点 else return nullptr; }
以前的代码:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==nullptr)
return NULL;
TreeLinkNode *node=nullptr;
//若节点有右子树,则下一个节点是右子树最左节点
if(pNode->right!=nullptr)
{
node=pNode->right;
while(node->left!=nullptr)
{
node=node->left;
}
}
//若节点没有右子树,则从其父节点入手
else if(pNode->next!=nullptr)
{
node=pNode;
TreeLinkNode *pNode_parent=pNode->next;
while(pNode_parent!=nullptr&&pNode_parent->left!=node)
{
node=pNode_parent;
pNode_parent=pNode_parent->next;
}
node=pNode_parent;
}
else
node=nullptr;
return node;
}
};
查看30道真题和解析