【算法题】二叉树的下一个结点

本文介绍了一种高效算法,用于在给定二叉树及其某个节点的情况下,寻找该节点在中序遍历下的下一个节点。通过三种情况的分析,包括右子树存在、当前节点为父节点的左子节点以及当前节点为父节点的右子节点,算法的时间复杂度优化至O(L),L为两节点间的实际距离。

题目描述

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

分析
暴力求解法:根据父结点指针找到根结点,进行中序遍历找到下一个结点即可,时间复杂度O(n)。
根据几种情况下的分析,时间复杂度可优化到O(L),L为该结点与后继结点在树中的实际距离。
1)如果该结点有右孩子,则找到右孩子的最左叶子结点返回;
2)如果该结点是父结点的左孩子,则将父结点返回;
3)如果该结点是父结点的右孩子,则继续向上查找(循环1~3),直到父结点为空,表示该结点没有后继结点。

代码


class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}

public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode) {
        if(pNode==null) return null;
        if(pNode.right!=null){
            TreeLinkNode tmp = pNode.right;
            while(tmp.left!=null) tmp=tmp.left;
            return tmp;
        }
        while(pNode.next!=null){
            if(pNode==pNode.next.left) return pNode.next;
            pNode=pNode.next;
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值