您的位置:首页 > 职场人生

剑指offer——面试题58:二叉树的下一个结点

2017-11-13 21:38 267 查看
    题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

    代码:

/*
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;
TreeLinkNode* nextNode = NULL;
if(pNode->right != NULL) // 如果该结点有右子树,那么下一个结点就是它右子树的最左子树
{
TreeLinkNode* pRight = pNode->right;
while(pRight->left != NULL) // 通过循环,寻找右子树的最左子树
pRight =pRight->left;
nextNode = pRight; // 返回下一个结点
}
else if(pNode->next != NULL) // 如果该结点没有右子树,
{
TreeLinkNode* parent = pNode->next;
TreeLinkNode* current = pNode;
while(parent != NULL && current == parent->right) // 如果该结点是它父结点的右子结点,不断沿着它父节点找,
{ // 直到找到一个是它父节点的左子结点
current = parent;
parent = parent->next;
}
nextNode = parent; // 如果该结点是它父节点的左结点,它下一个结点就是它的父结点
}
return nextNode;
}
};
    分析:代码注释非常详尽了,不赘述。牛客网这题给的例程不好, next 其实表示的是父结点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: