根据中序遍历的特色:左根右。可分为三种状况:1. 一个节点有右子树,那么它的下一个节点就是它的右子树的最左子节点。2. 一个节点没有右子树且它仍是它父节点的左子节点,那么它的下一个节点就是它的父节点。3. 一个节点没有右子树且它仍是它父节点的右子节点,那么它的下一个节点就是含有左子节点的祖先节点。编程
/* 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 == nullptr) return nullptr; // 状况1 if(pNode->right != nullptr) { pNode = pNode->right; while(pNode->left != nullptr) { pNode = pNode->left; } return pNode; } // 状况2和3 while(pNode->next != nullptr) { // 节点的父节点 TreeLinkNode* pRoot = pNode->next; if(pRoot->left == pNode) //状况2 { return pRoot; } //状况3,继续找它的父节点 pNode = pNode->next; } return nullptr; } };
细细分析可知,状况2和3实际上是同一种状况。同理,对于前序和后序的下一个节点也可如此分析。spa