题目
给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
思路
自己试着画图分析后。可以发现下一个结点的规律为:
1.若当前结点有右子树时,其下一个结点为右子树中最左子结点;
2.若当前结点无右子树时,
(1)若当前结点为其父结点的左子结点时,其下一个结点为其父结点;
(2)若当前结点为其父结点的右子结点时,继续向上遍历父结点,直到找到一个结点是其父结点的左子结点,如果这样的节点存在,那么这个节点的父节点就是我们要找的下一个节点。若找不到,表示中序遍历已经完成,下一个结点为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 == nullptr)
return nullptr;
TreeLinkNode *next = nullptr;
//右子树不为空时,找到右子树的最左子结点即为结果
if(pNode->right != nullptr)
{
TreeLinkNode* temp = pNode->right;
while(temp->left != nullptr){
temp = temp->left;
}
next = temp;
}
//向父结点遍历
else if(pNode->next != nullptr){
TreeLinkNode* cur = pNode;
TreeLinkNode* parent = pNode->next;
while(parent!=nullptr && cur!=parent->left){
cur = parent;
parent = parent->next;
}
next = parent;
}
return next;
}
};