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

二叉树的下一个结点

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.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗  他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了  好好准备,等待明天的影石360和周四的腾讯了  加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
2025-12-29 22:36
武汉大学 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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