题目意思:
对于一颗二叉树,如果节点是中序遍历的顺序,求树中任意节点的下一个遍历节点。
这道题目本质上是考察对中序遍历的理解程度。
在中序遍历中,一个节点如果有右节点,那么它的下一个节点就是右字数的最左子点;
如果一个节点没有右节点,那么它的下一个节点就得回溯,回溯到这样一种 情形,某节点是其父节点的左子节点,那么就会回溯到其父节点(“左根右”,左边遍历结束,要回溯到根),因此其下一个节点就是该父节点。
- 当前节点有 右节点,那么当前节点的下一个节点 是从其右子节点出发,到达最左子节点。
- 当前节点没有右节点,循环 寻找到 其父节点,使得当前节点是父节点的左子节点,那么,父节点就是 原始当前节点的下一节点。
/*
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;
if((pNode->right)!=nullptr)
{
TreeLinkNode* tmp = pNode->right;
while(tmp->left)
{
tmp = tmp->left;
}
return tmp;
}
else
{
while(pNode->next)
{
if (pNode->next->left==pNode)
{
return pNode->next;
}
pNode = pNode->next;
}
return nullptr;
}
}
};