二叉树的下一个节点

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。

注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

1.分两种情况考虑

(1) 有右子树的情况: 那么它下一个节点就是它的右子树的最左子树   先右转 然后左转一直走!!

(2) 无右子树的情况: (1)如果节点是其父亲节点的左子节点,那么其实我们所要搜寻的下一个节点就是这个父亲节点!!!

                                  (2)如果节点是其父亲节点的右子节点,那么就应该沿着该父亲节点的指针 next 一直向上遍历 ;

                                           直到找到一个节点是其父亲节点的左节点;

/*
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)
    {
        TreeLinkNode * parents;
        
        if(pNode==nullptr)//检查
        return NULL;
        //第一种情况 存在右子树
        if(pNode->right!=NULL)
         {
            pNode=pNode->right;//先指向右边
            while(pNode->left!=NULL)
            {
               pNode=pNode->left;
            }
            return pNode;    
         }
       //第二种情况
        while(pNode->next!=NULL)//向上遍历  父亲节点
        {
            parents=pNode->next; //父亲 
         
           if(parents->left== pNode){  //其父亲节点的左边节点是当前这个节点
                
              return parents ; //返回父亲节点
            }
          pNode=pNode->next;//一直向后移动
            
        }
        return NULL;//都不是 就是没找到
        
        
      
    }
};
原文地址:https://www.cnblogs.com/cgy1012/p/11369670.html