中序遍历为左根右的顺序
思路:如果这个节点有右子树,那么右子树的最左下节点就是解
否则,如果没有右子树,那么看它有没有父亲节点,如果没有父亲节点,那么这个节点无后继,反之,我们首先观察它是不是父亲节点的左子树,如果成立,那么父亲节点就是后继,如果该节点是父亲节点的右子树,那么我们需要一直向上看,直到找到一个父亲节点是左子树,那么这个父亲节点的父亲节点就是解,如果没有找到这样的父亲节点,那么无后继。
代码:
//寻找二叉树的中序遍历下一个节点
//思路:如果这个节点有右子树,那么下一个节点为右子树的最左节点
//否则,如果没有右子树,那么看其有没有父亲节点,如果无父亲,那么无后继
//反之,如果有父亲,那么看它是否是父亲节点的左子树,如果是,那么父亲即是下一个节点
//如果不是,它是父亲节点的右子树,那么一直向上查找父亲,直到找到一个父亲节点为左子树为止,否则无后继
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
const int INF = 0x3f3f3f3f;
class Solution {
public:
Solution()
{
}
~Solution()
{
}
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==nullptr) return nullptr;
if(pNode->right!=nullptr) {
TreeLinkNode* solve = new TreeLinkNode(INF);
solve = pNode->right;
while(solve->left!=nullptr) {
solve = solve->left;
}
return solve;
}
else {
//查找父亲节点
if(pNode->next==nullptr) return nullptr;
else {
//看其是不是父亲节点的左子树
if((pNode->next)->left==pNode) {
return pNode->next;
}
else {
//其是父亲节点的右子树,那么一直向上进行查找
TreeLinkNode* parent = new TreeLinkNode(INF);
parent=pNode->next;
while(parent->next!=nullptr)
{
if((parent->next)->left==parent) return parent->next;
parent = parent->next;
}
return nullptr;
}
}
}
}
};