剑指offer 57:二叉树的下一个结点

思路:

中序遍历中

有右子树,就是其右子树的下一个结点, 比如结点5的下一个结点是7

没右子树,是其父亲的左子树,下一个结点是其父亲,比如结点9的下一个结点是4

没右子树,是父亲的右子树,下一个节点是当前节点所在左子树根,比如结点2的下一个结点是3

剑指offer 57:二叉树的下一个结点

#include <iostream>

using namespace std;


struct TreeLinkNode
{
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;

    TreeLinkNode(int x = 0)
        :val(x), left(NULL), right(NULL), next(NULL) {

    }
};

class Solution
{
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        if (pNode == NULL) {
            return NULL;
        }

        TreeLinkNode *pNext = NULL;
        //当前节点有右子树,那么中序遍历的下一个结点就是其右子树的最左结点
        if (pNode->right != NULL) {
            pNext = pNode->right;
            while (pNext->left != NULL) {
                pNext = pNext->left;
            }
        }
		
        else if (pNode->right == NULL && pNode->next != NULL) {
            TreeLinkNode *pCurrent = pNode;
            TreeLinkNode *pParent = pNode->next;
		//没有右子树,是父亲的左子树,下一个结点就是父结点
            
        //没右子树,是父亲的右子树,下一个结点是当前结点所在左子树的根
        //顺着父结点一直向上遍历,直到找到一个它父结点所在左子数的根
            while (pParent != NULL && pCurrent == pParent->right) {
                pCurrent = pParent;
                pParent = pParent->next;
            }
            pNext = pParent;
        }

        return pNext;
    }
};

int main()
{
    Solution solu;
    TreeLinkNode tree[10];
    tree[0].val = 3;
    tree[0].left = &tree[1];
    tree[0].right = &tree[2];
    tree[0].next = NULL;


    tree[1].val = 6;
    tree[1].left = &tree[3];
    tree[1].right = &tree[4];
    tree[1].next = &tree[0];


    tree[2].val = 5;
    tree[2].left = NULL;
    tree[2].right = &tree[5];
    tree[2].next = &tree[0];


    tree[3].val = 4;
    tree[3].left = &tree[6];
    tree[3].right = NULL;
    tree[3].next = &tree[1];

    tree[4].val = 2;
    tree[4].left = NULL;
    tree[4].right = NULL;
    tree[4].next = &tree[1];

    tree[5].val = 7;
    tree[5].left = &tree[7];
    tree[5].right = NULL;
    tree[5].next = &tree[2];

    tree[6].val = 9;
    tree[6].left = NULL;
    tree[6].right = NULL;
    tree[6].next = &tree[3];

    tree[7].val = 6;
    tree[7].left = &tree[8];
    tree[7].right = &tree[9];
    tree[7].next = &tree[5];

    tree[8].val = 8;
    tree[8].left = NULL;
    tree[8].right = NULL;
    tree[8].next = &tree[7];

    tree[9].val = 1;
    tree[9].left = NULL;
    tree[9].right = NULL;
    tree[9].next = &tree[7];

    cout << solu.GetNext(&tree[7])->val << endl;
    return 0;
}