题解 | #二叉树的下一个结点#

二叉树的下一个结点

http://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e

解题思路:分两种情况来处理,1.如果该节点有右子树,则中序遍历的下一个节点是该节点右子树的左到不能左的节点;2.如果该节点没有右子树,则看该节点的父节点;如果该节点是它父节点的左子节点,那么中序遍历的下一个节点就是该节点的父节点;3.如果该节点既没有右子树,并且它还是它父节点的右子节点,那么这个情况就比较复杂,需要沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。如果这样的节点存在,那么这个节点的父节点就是我们要找的中序遍历的下一个节点。

时间复杂度:O(n)

空间复杂度:O(1)

基于C++实现的:

class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        //判断节点为空的情况
        if(pNode == nullptr){
            return nullptr;
        }
        TreeLinkNode *pNodenext = nullptr;
        //如果pNode有右子树,则中序遍历的下一个节点是右子树的最左节点;
        if(pNode->right != nullptr){
            pNodenext = pNode->right;
            if(pNodenext->left != nullptr){
                pNodenext = pNodenext->left;
            }
            return pNodenext;
        }
        //如果pNode没有右子树,则判断pNode的父节点
        while(pNode->next){
            pNodenext = pNode->next;
            if(pNode == pNodenext->left){
                return pNodenext;
            }
            pNode = pNode->next;
        }
        return nullptr;
    }
};

基于python实现:

class Solution:
    def GetNext(self, pNode):
        # 空节点情况
        if not pNode:
            return pNode
        # 有右子树的情况
        while pNode.right:
            p = pNode.right
            if p.left:
                p = p.left
            return p
        # 无右子树,考虑父节点的情况
        while pNode.next:
            p = pNode.next
            if p.left == pNode:
                return p
            pNode=p
全部评论

相关推荐

菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务