57、劍指offer--二叉樹的下一結點
阿新 • • 發佈:2017-07-03
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 returnNULL; 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--二叉樹的下一結點