二叉树的下一个节点 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
当某一刻该点不是父节点的右子了(也就是左子了),则他的父亲就是题中所求的下一个点了。