剑指offer——二叉树的下一个节点

来源:互联网 发布:三体读后感知乎 编辑:程序博客网 时间:2024/06/09 14:39

1. 题目描述

  给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

2. 思路分析

  在编写程序之前,先缕清思路。在该题总,应该分不同情况对其进行讨论。
情况一:(鲁棒性)目标节点为空节点时返回ptr;
情况二:目标节点没有父节点且没有右子树时,即该节点就是中序遍历的最后一个元素了,下一个节点为nullptr;
情况三:目标节点有右子树时,下一个节点就为其右子树中的最左元素;
情况四:目标节点没有右子树,但目标节点有父节点时。此时应判断目标节点是其父子树的左子树还是右子树。如果目标节点为左子树,那么下一个节点就是其父节点。如果目标节点为右子树,那么就一直向上找父节点,知道所找的点是其父节点的左子树,那么结果就是找到的点的父节点。

3. 题目解答——cpp

/*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;        if (pNode->right == nullptr && pNode->next == nullptr)            return nullptr;        TreeLinkNode* pNext;        if (pNode->right != nullptr) { // 当前节点有右节点            pNext = pNode->right;            while(pNext->left != nullptr) {                pNext = pNext->left;            }            return pNext;        }        if (pNode->next != NULL) { // 当前节点没有右孩子,但有父节点            pNext = pNode->next; // 下一被检索节点为其父节点            // 情况一:当前节点为父节点的右孩子            while(pNext != nullptr && pNext->right == pNode) {                pNode = pNext;                pNext = pNext->next;            }        }        return pNext;    }};
原创粉丝点击