1. 程式人生 > >57、劍指offer--二叉樹的下一結點

57、劍指offer--二叉樹的下一結點

ont amp class -- 其中 pre 劍指offer 左右 註意

題目描述 給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。註意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。 解題思路:兩種情況,若果一個結點有右子樹,那麽其下一個結點為它的右子樹中的最左節點; 若一個結點無右子樹,兩種情況: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 };

57、劍指offer--二叉樹的下一結點