题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路
思路1:不要整花里胡哨的,直接暴力干它
既然说要找中序遍历的下一个,我们就把中序遍历写出来。
那么问题来了,这里给的结点是二叉树的某个结点而不一定是它的根节点,因此我们就要先把根节点找出来才能进行中序遍历。
题目的结点给出了指向父节点的指针,那么根节点是没有父节点的,因此我们一直向上迭代就行了。
找出来根结点,进行中序遍历,存入一个数组。
再遍历一次找到题目给的结点,再输出下一个,这里注意最末尾的下一个是空,需要多加一个判断。
实现:
class Solution {
public:
void dfs(TreeLinkNode* t,vector<TreeLinkNode*> &v)
{
//中序遍历
if (!t) return;
dfs(t->left,v);
v.push_back(t);
dfs(t->right,v);
}
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
TreeLinkNode* p=pNode;
while(p->next)//找根结点
{
p=p->next;
}
vector<TreeLinkNode*> v;
dfs(p,v);//中序遍历
for (int i=0;i<v.size();i++)
{
if (v[i]==pNode&&i!=v.size()-1)//相等且不是最末尾就直接输出下一个
return v[i+1];
}
return nullptr;
}
};
思路2:
分情况讨论