二叉树的下一个节点 c++
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if (pNode->right != nullptr)
return findleftleaf(pNode->right);
if (pNode->next == nullptr)
return nullptr;
else{
if (pNode->next->left == pNode)
return pNode->next;
else {
if (pNode->next->next == nullptr)
return nullptr;
return whetherrightleaf(pNode);
}
}
}
TreeLinkNode* findleftleaf(TreeLinkNode* Node){
//找最左叶子
while(Node->left != nullptr){
Node = Node->left;
}
return Node;
}
TreeLinkNode* whetherrightleaf(TreeLinkNode* Node){
while(Node->next->right == Node){
Node = Node->next;
// 是最右叶子,没有后节点了
if (Node->next == nullptr)
return nullptr;
}
return Node->next;
}
};了解二叉树结构与中序遍历知识之后,分析思路如下:
1、如果该点有右子树,则下一个点是右子树的最左节点,函数findleftleaf()实现该功能。
2、若其无右子树,则看其父节点,如下考虑:
2.1 父节点为空,则其是没有右子树的根节点,也是中序最后一个点。
2.2 父不为空,如下考虑:
1)该点为父亲的左子,则下一个点是父节点,返回。
2)否则为右子,则一路向上寻找迭代,(函数whetherrightleaf()实现)
当某一刻该点无父节点时,说明题目给的点是树的最右节点了,返回nullptr
当某一刻该点不是父节点的右子了(也就是左子了),则他的父亲就是题中所求的下一个点了。
科大讯飞公司氛围 425人发布