寻找给定二叉树节点的下一节点

本文探讨了二叉树中寻找给定节点的下一个节点的两种方法:暴力法和直接寻找法。暴力法通过中序遍历整个树并存储节点到列表中,再查找目标节点的下一个节点;直接寻找法则根据节点的不同情况,如是否有右子树或在父节点的位置,直接定位下一个节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
这题有两种解法,暴力法和直接寻找法。
暴力法的大致思路是,先根据给出的节点寻找这棵树的根节点,然后从根节点开始中序遍历加入List集合中。最后遍历集合找到pNode的下一个节点。
代码如下:

/*暴力方法*/
List<TreeLinkNode> list = new List<TreeLinkNode>();
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
    if (pNode == null) return null;
    TreeLinkNode father = pNode;
    while (father.next != null)
    {
        father = father.next;
    }
    InOrder(father);
    for (int i = 0; i < list.Count; i++)
    {
        if (list[i] == pNode)
        {
            if (i == list.Count - 1)
            {
                return null;
            }
            return list[i + 1];
        }
    }
    return null;

}
public void InOrder(TreeLinkNode root)
{
    if (root == null)
    {
        return;
    }
    InOrder(root.left);
    list.Add(root);
    InOrder(root.right);
}

直接寻找法这个就神了,通过找规律可以找到给定节点的下一节点。
先给出参考图,图来自牛客官方题解:
在这里插入图片描述
节点的遍历顺序如图序号所标注的那样。

我们将给定节点分为以下几种情况(第三种情况有点绕,各位多看几遍):

1.有右孩子,下一结点是右子树中的最左孩子。

2.无右孩子,且结点是该结点父结点的左孩子,则下一结点是该结点的父结点

3.无孩子,且结点是该结点父结点的右孩子,则我们一直沿着父结点追朔,直到找到某个结点是其父结点的左孩子,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点。

/*直接寻找下一节点法*/
    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)
        {
            TreeLinkNode father=pNode.next;
            if(father.left==pNode)
            {
                return father;
            }
            pNode=pNode.next;
        }
        return null;
    }

顺便吐槽一下,这里的树类里边节点的父亲叫next???
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值