(剑指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; } } };