题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:两种情况,若果一个结点有右子树,那么其下一个结点为它的右子树中的最左节点;
若一个结点无右子树,两种情况:1)如果结点是其父结点的左子结点,那么它的下一结点为其父节点;2)如果结点是其父结点的右子节点,则沿着父节点向上遍历直到,找到一个是它父结点的左子结点的结点,如果找到,这个结点的父节点即为下一结点
1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *left; 5 struct TreeLinkNode *right; 6 struct TreeLinkNode *next; 7 TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { 8 9 } 10 }; 11 */ 12 class Solution { 13 public: 14 TreeLinkNode* GetNext(TreeLinkNode* pNode) 15 { 16 if(pNode == NULL) 17 return NULL; 18 TreeLinkNode *pNext = NULL; 19 //有右结点,其下一结点为右结点的最左子结点 20 if(pNode->right != NULL) 21 { 22 TreeLinkNode *pRight = pNode->right; 23 while(pRight->left != NULL) 24 pRight = pRight->left; 25 pNext = pRight; 26 } 27 //无右结点 28 else 29 { 30 TreeLinkNode *pCurrent = pNode; 31 TreeLinkNode *pParent = pNode->next; 32 while(pParent != NULL && pCurrent == pParent->right)//是父结点的右子结点,沿父结点一直向上查找 33 { 34 pCurrent =pParent; 35 pParent = pParent->next; 36 } 37 pNext = pParent; 38 } 39 return pNext; 40 } 41 };
时间: 2024-11-05 14:47:00