题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
个人思路:记录中序遍历结果,从中寻找。代码如下:
/*
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 path(queue<TreeLinkNode*> &t,TreeLinkNode* root)//中序遍历
{
if(root->left==NULL&&root->right==NULL)
{
t.push(root);
return ;
}
if(root->left!=NULL)
{
path(t,root->left);
}
t.push(root);
if(root->right!=NULL)
{
path(t,root->right);
}
}
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL) return NULL;
TreeLinkNode* temp = pNode;
while(pNode->next!=NULL)
{
pNode = pNode->next;
}
queue<TreeLinkNode*> t;//存放中序遍历结果
path(t,pNode);
while(t.front()!=temp)
{
t.pop();
}
t.pop();
if(t.empty())
{
return NULL;
}
return t.front();
}
};
但真的勇士敢于直面问题,不迂回突击,不做中序遍历直接寻找
思路:
- 当前结点的右子树不为空,根据中序遍历左根右,则下一个结点为右子树中最左边的点,如B,A,
- 当前结点的右子树为空,这里也分两种情况,当前结点是父节点的左子树,则下一个结点即为父节点,如H,
- 如果当前结点是父节点的右子树,如G,E,K,则找它 的父节点,直到,当前结点是父节点的左子树,如果不存在,如C点,则返回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:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL) return NULL;
if(pNode->right!=NULL)//右子树不为空,找最左边的点
{
pNode=pNode->right;
while(pNode->left!=NULL)
{
pNode=pNode->left;
}
return pNode;
}
while(pNode->next!=NULL)//右子树为空
{
if(pNode->next->left==pNode) return pNode->next;//是父节点的左子树
pNode=pNode->next;//寻找父节点的父节点
}
return NULL;//尾节点,则返回NULL
}
};