给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
(1) 若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点 B )
(2) 若该节点不存在右子树:这时分两种情况
2.1 该节点为父节点的左子节点,则下一个节点为其父节点(如图节点 D
2.2 该节点为父节点的右子节点,则沿着父节点向上遍历,知道找到一个节点的父节点的左子节点为该节点,则该节点的父节点下一个节点(如图节点 I,沿着父节点一直向上查找找到 B (B 为其父节点的左子节点),则 B 的父节点 A 为下一个节点)
struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } };
TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(pNode==NULL) return NULL; if(pNode->right!=NULL) { pNode =pNode->right; while(pNode->left) { pNode=pNode->left; } return pNode; } while(pNode->next) { if(pNode->next->left==pNode) return pNode->next; pNode=pNode->next; } return NULL; }