题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
编程思想
根据中序遍历的特点:左根右。可分为三种情况: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其实是同一种情况。同理,对于前序和后序的下一个节点也可如此分析。