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

二叉树的下一个结点

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

算法思想一:暴力法

解题思路:

直接模拟题意。题意需要找到某个结点中序遍历的下一个结点,那很显然可以这样:
1、根据给出的结点求出整棵树的根节点
2、根据根节点递归求出树的中序遍历,存入res中
3、在res中查找当前结点,则当前结点的下一结点即为所求。
1、当找到当前结点是数组最后一个元素,则直接返回 None/Null
2、当找到当前结点不是数组最后一个元素,则返回下一个数组结点
二叉树中序遍历DBHEIAFCG图例:

代码展示:

Python版本
class Solution:
    def GetNext(self, pNode):
        # write code here
        # 中序遍历存储数组
        res = []
        cur = pNode
        while cur.next:
            cur = cur.next
        self.inorder(cur, res)
        
        for i in range(len(res)):
            if pNode == res[i]:
                # 判断 i 是不是最后一个结点,是则返回none,否则返回下一个数组结点
                return None if i == len(res)-1 else res[i+1]
        return None
    # 递归遍历中序
    def inorder(self, cur, res):
        if cur:
            self.inorder(cur.left, res)
            res.append(cur)
            self.inorder(cur.right, res)

复杂度分析:

时间复杂度O(N):N表示树的结点数量,递归遍历整个树结点,查找遍历数组,最差情况都是O(N)
空间复杂度O(N):存储二叉树中序遍历数组res占用空间O(N)

算法思想二:最优解法

解题思路:

仔细观察,可以把中序(DBHEIAFCG)下一结点归为几种类型:
1、有右子树,下一结点是右子树中的最左结点,例如 B,下一结点是 H
2、无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点,例如 H,下一结点是 E
3、无右子树,且结点是该结点父结点的右子树,则一直沿着父结点追朔,直到找到某个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点。例如 I,下一结点是 A;例如 G,并没有符合情况的结点,所以 G 没有下一结点

代码展示:

JAVA版本
public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if(pNode == null) return null;
        
        //如果当前结点的右子树是不为空
        if(pNode.right != null){
            pNode = pNode.right;
            while(pNode.left != null)
                pNode = pNode.left;
            return pNode;
        }
        //当前结点无右子树时,判断结点是父结点的左子树还是右子树
        while(pNode.next != null){
            if(pNode.next.left == pNode)
                return pNode.next;
            pNode = pNode.next;
        }
        return null;
    }
}

复杂度分析:

时间复杂度O(N):N表示树的结点数量,最差情况查找整个二叉树
空间复杂度O1):不需要额外空间


全部评论
最优解法的分析比官方的清楚
1 回复 分享
发布于 2022-01-10 21:08

相关推荐

11-29 11:21
门头沟学院 Java
总包48.5w,意想不到的价格
想开了的垂耳兔很喜欢拱白菜:转人工
点赞 评论 收藏
分享
菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
24
3
分享
牛客网
牛客企业服务