題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
先來解釋一下這個題目,說實話我第一下沒看懂啥意思。意思就是說比如一個二叉樹的中序遍歷是ABCDEF,然後給你B,讓你把C返回,給你D讓你把E返回。這道題還有一個就是,節點A的父節點是A->next。總感覺這樣表示怪怪的。
思路
我上面那麼一解釋題目,感覺有一個特別蠢笨的方法,找到根節點,把樹的所有節點中序遍歷到一個vector<node*>裏面,然後找到節點pNode 返回下一個元素。這方法太蠢了,首先中序遍歷有用到遞歸,然後還用vector裝,還要最後對vector進行查找遍歷。時間空間複雜度都特別蠢。
下來說一下正常的方法:
(1)當pNode,返回空;
(2)當pNode->right存在的時候,那麼我們就一直找pNode->right的左孩子,直至沒有左孩子。例如給出J節點,讓求K節點。
(3)當pNode->right不存在的時候,那麼我們就一直找pNode的父節點(pNode->next),在找父節點的同時我們要看一下pNode是不是父節點的左孩子,若是左孩子,則直接返回父節點。例如給出 I 節點,讓找出J節點。
代碼
/*
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)//(1)當pNode,返回空
return nullptr;
if (pNode->right != nullptr) { //(2)當pNode->right存在的時候
TreeLinkNode* tmp=pNode->right;
while (tmp->left != nullptr) {
tmp = tmp->left;
}
return tmp;
}
else {
while (pNode->next != nullptr) { //(3)當pNode->right不存在的時候
TreeLinkNode* tmp2 = pNode->next;
if (pNode == tmp2->left)
return tmp2;
pNode = pNode->next;
}
}
return nullptr;
}
};