题目描述
给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。
思路
![]()
这道题给出的是二叉树的中序遍历,即左中右。在求下一个结点时,分一下几种情况讨论:
- 节点有右子树,找右子树中最左边的节点, 如图中C的下一个结点就是F;
- 节点没有右子树,且是其父节点的左子树,下个节点就是父节点, 如图中G的下一个结点就是E;
- 节点没有右子树,且是父节点的右子树,找下个节点,一直向上遍历,直到遇到一个节点是其父节点的左子树,那么父节点就是下个节点;如图中I的下一个结点是A。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| 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 Tree { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(pNode == nullptr) return nullptr; if(pNode->right!=nullptr) { pNode = pNode->right; if(pNode->left!=nullptr) pNode = pNode->left; return pNode; } while(pNode->next!=nullptr) { if(pNode->next->left == pNode) return pNode->next; pNode = pNode->next; } return nullptr; } };
|