(剑指Offer)面试题58:二叉树的下一个结点

题目:

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路:

考虑中序遍历的过程,

如果当前结点存在右子节点,那么当前结点的下一个结点应该为该右子树的最左边的结点;

如果当前结点没有右子节点,那么如果当前结点的父结点p->parent为其父结点的父结点p->parent->patent的左子结点,那么当前结点的下一结点即为其父结点;否则继续往上遍历,直至找到一个结点为其父结点的左子结点,那么该结点即为当前结点的下一结点,如果找不到,则返回NULL;

(文字描述比较晦涩,大家可以画图看看)

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/9023a0c988684a53960365b889ceaf5e?rp=3

AC代码:

using namespace std;
/*
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==NULL)
            return NULL;
        if(pNode->right!=NULL){
            TreeLinkNode* pTmp=pNode->right;
            while(pTmp->left!=NULL){
                pTmp=pTmp->left;
            }
            return pTmp;
        }
        else{
            while(pNode->next!=NULL){
                if(pNode==pNode->next->left)
                    return pNode->next;
                pNode=pNode->next;
            }
            return NULL;
        }
    }
};
    原文作者:AndyJee
    原文地址: https://www.cnblogs.com/AndyJee/p/4709117.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞