https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e
思路1:对树进行中序遍历,用数组保存遍历结果
vector<TreeLinkNode *> in; //保存中序遍历结果
TreeLinkNode *GetRoot(TreeLinkNode *pNode) {
while (pNode->next) pNode = pNode->next;
return pNode;
}
void InOrder(TreeLinkNode *pNode) {
if (pNode->left) InOrder(pNode->left);
in.push_back(pNode);
if (pNode->right) InOrder(pNode->right);
}
TreeLinkNode *GetNext(TreeLinkNode *pNode) {
TreeLinkNode *pRoot = GetRoot(pNode); // 找到树根
InOrder(pRoot); // 从树根开始中序遍历
for (int i = 0; i < in.size(); ++i) {
if (in[i]->val == pNode->val && i+1<in.size()){
return in[i+1];
}
}
return nullptr;
}
思路2:分析中序遍历的特点
TreeLinkNode *GetLeftMost(TreeLinkNode *pNode) {
while (pNode->left) pNode = pNode->left;
return pNode;
}
TreeLinkNode *GetNext(TreeLinkNode *pNode) {
if (pNode->right) {
// 当前结点存在右子树,返回右子树的最左结点
return GetLeftMost(pNode->right);
} else {
// 当前结点无右子树时,判断结点是父结点的左子树还是右子树
while(pNode->next != nullptr){
if(pNode->next->left == pNode)
return pNode->next; // 若是左子树,返回父节点
pNode = pNode->next; // 若是右子树,继续判断其父节点
}
return nullptr; // 当pNode是中序遍历的最后一个结点才会走到这里
}
}