给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
方法一:暴力法,借助vector实现
1.根据给出的结点求出整棵树的根节点
2.根据根节点递归求出树的中序遍历,存入vector
3.在vector中查找当前结点,则当前结点的下一结点即为所求。
代码实现:
class Solution {
public:
void mid_order(TreeLinkNode* root,vector<TreeLinkNode*> &res){
if(root==nullptr){
return;
}
mid_order(root->left,res);
res.push_back(root);
mid_order(root->right,res);
}
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
TreeLinkNode *root=nullptr;
TreeLinkNode *tmp=pNode;
while(tmp){//根据给定节点tmp找到根节点
root=tmp;
tmp=tmp->next;
}
vector<TreeLinkNode*> res;
mid_order(root,res);//中序遍历根节点,并将遍历结果压入vector;
for(int i=0;i<res.size();++i){//遍历vector,找到当前节点,找到时返回下一个节点
if(res[i]==pNode){
return res[i+1];
}
}
return nullptr;
}
};
方法二:寻找规律,使用优化解实现
代码如下:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==nullptr){
return nullptr;
}
TreeLinkNode *pNext=nullptr;
if(pNode->right!=nullptr){//如果右子节点不为空,
TreeLinkNode *pRight=pNode->right;
while(pRight->left!=nullptr){//如果右子节点的左子节点不为空,则一直循环,当前节点的下一个就是右子节点的最左子节点
pRight=pRight->left;
}
pNext=pRight;
}else if(pNode->next!=nullptr){
TreeLinkNode *cur=pNode;
TreeLinkNode *parent=pNode->next;
while(parent!=nullptr&&cur==parent->right){//当当前节点是其父节点的右子节点时一直循环直到当前节点是其父节点的左子节点
cur=parent;
parent=parent->next;
}
pNext=parent;
}
return pNext;
}
};