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

二叉树的下一个结点

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
全部评论

相关推荐

买蜜雪也用卷:我觉得应该没有哪个人敢说自己熟练使用git,代码分支一复杂还是得慢慢寻思一下的,不过基本的拉代码提交代码还有分支什么的是应该会
点赞 评论 收藏
分享
能干的三文鱼刷了100道题:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
感觉今年拿到大厂实习offer的人很多,光是身边同学室友都是好几个offer。由此可见,秋招得有多卷
小浪_Coding:必须卷的起飞, 应该比25更卷一点, 25已经是哀声一片了, 26会更难一点, 现在还有`很多25未找到的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务