思路1:因为题目给出的节点是子结构的根节点,所以需要向上寻找整棵树的根节点,再采用中序遍历将结点存储在vector中,依次遍历按要求输出即可
思路2:根据二叉搜索树的特点,比如3,5,4;4 就是父节点,3是左孩子,5是右孩子,可以总结出以下几点:1.当前节点=父亲节点的左孩子(即3),那么可以直接返回父亲节点;2.当前节点=父亲节点的右孩子(即5,但是树若复杂一点),那么需要往上寻找,直到node==node->next->left,这是因为这个节点处在整棵树的左子树下,所以找到整棵树的根即可;3.若这个节点有右子树,则直接找右子树的最左边的结点即可;4.如果节点处在右子树,并且不符合第一点(即5),并且经过第二点也找不到,则说明他没有下一个节点,返回NULL即可
/*
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:
void inOrder(TreeLinkNode* root, vector<TreeLinkNode*>& myvector)
{
if(root)
{
inOrder(root->left, myvector);
myvector.push_back(root);
inOrder(root->right, myvector);
}
else
return;
}
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
TreeLinkNode*temp=pNode;
TreeLinkNode*head=NULL;
while(temp)
{
head=temp;
temp=temp->next;
}
vector<TreeLinkNode*> myvector;
inOrder(head, myvector);
int size=myvector.size();
for(int i=0;i<size;i++)
{
if(myvector[i]==pNode&&i!=size-1)
return myvector[i+1];
}
return NULL;
}
};
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if(!pNode)
return NULL;
if(pNode->right)
{
pNode=pNode->right;
//寻找右子树的最左边的结点
while(pNode->left)
pNode=pNode->left;
return pNode;
}
while(pNode->next)
{
if(pNode==pNode->next->left)
{
return pNode->next;
}
pNode=pNode->next;
}
//处理末尾结点
return NULL;
}
};