1,题目要求
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
2,题目思路
对于这道题,要求找到中序遍历的下一个节点。
首先,对于中序遍历而言,自然是先左、再根、最后右。
在观察遍历策略之后,我们可以得出:
1,如果二叉树为空,则直接返回空;
2,如果该节点右孩子存在,那么就设置一个指针,从该节点的右孩子出发,一直沿着指向左子节点的指针,一直找到最左叶子节点,该节点即为下一个节点;
3,当该节点不是根节点时:如果该节点是其父亲节点的左孩子,那么,该节点的下一个节点就是其父亲节点;否则,就继续向上遍历其父亲节点的父亲节点,重复之前3的判断,返回结果。
3,代码实现
/*
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)
return nullptr;
if(pNode->right){
pNode = pNode->right;
while(pNode->left)
pNode = pNode->left;
return pNode;
}
while(pNode->next){
TreeLinkNode* pRoot = pNode->next;
if(pRoot->left == pNode)
return pRoot;
pNode = pNode->next;
}
return nullptr;
}
};