题目:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针
分析:
1.如果该节点有有右子树,则下一个节点就是右子树的最左结点(中序:左根右)
2.如果该节点没有右子树如果它是父亲的左孩子,则下一个就是父亲;如果它是父亲的右孩子,则要一直向上找到父亲的父亲,直到这个父亲是它父亲的左孩子,此时下一个就是它父亲(如果向上某个结点是父亲的右孩子就不能直接访问,因此这说明父亲已经访问过了),则它就是最后一个节点(因为它也没有右子树)
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==nullptr)
return nullptr;
if(pNode->right)//有的是右子树
{
TreeLinkNode* cur=pNode->right;//右子树头结点
while(cur->left)
{
cur=cur->left;
}
//来到这cur是最左结点
return cur;
}
else//没有右子树
{
while(pNode->next)//说明不是根(并且此时没有右子树)
{
TreeLinkNode* root=pNode-