查询后继节点、微软纸条折痕问题

一、查询后继节点

后继节点:中序遍历时,某个节点的后一个节点即是该节点的后继节点。

规定二叉树的结构如下:

public static class Node {
   
    public int value;
    public Node left;
    public Node right;
    // 父节点
    public Node parent;

    public Node (int v) {
   
        value = v;
    }
}

如何快速的找到某个节点的后继节点

1、思路

1、按照后继节点的定义来查找某个节点的后继节点

即按中序遍历此二叉树,再查找指定节点的后继节点。时间复杂度是O(N)。显然此方法不是最优解。

2、根据二叉树的结构,以及多的这个parent指针来查找

(1)指定节点X有右树,则X的后继节点就是X右树上最左的孩子。根据后继节点的定义得出的。

(2)X无右树,则根据parent指针往上找,直到找到某个节点是它父节点Y的左孩子为止,则Y就是X的后继节点;如果一直往上都没有找到某个节点是它父节点的左孩子,则该节点是最右的孩子,无后继节点。

Why:因为X是Y左树上的最右孩子,按照中序遍历的顺序,遍历完X就是Y了。
在这里插入图片描述

时间复杂度是O(K)(K是指定节点到后继节点的最短节点数)

很显然第二种方法更优。

2、代码

/**
 * 查找后继节点
 *     
 * &#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值