面试题 8:二叉树的下一个节点----Android端的实现方式

本文介绍了一种在给定二叉树及其节点的情况下,如何找出该节点在中序遍历中的下一个节点的方法。主要讨论了四种情况,并提供了一个具体的算法实现。

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

题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左,右子节点的指针,还有一个指向父节点的指针。(二叉树如下图所示)

     中序遍历:{d,b,h,e,i,a,f,c,g}

分析: 考虑中序遍历的特点以及下一个节点可能出现的情况

 1. 节点的左子树不可能有下一节点(中序遍历)

 2. 节点的右子树存在时,其右子树的最左子节点就是下一节点

 3.节点没有右子树时,如果当前节点是其父节点的左子节点,则父节点为下一节点

4. 节点没有右子树时,如果当前节点是其父节点的右子节点,则需要继续向上寻找父节点,直到满足条件3

Android 端代码的实现:----代码中有详细的注释

    /**
     * 根据给出的节点,找到在--中序遍历--中的下一个节点
     *
     * @param targetNode
     * @return
     */
    private TreeNode getNextNode(TreeNode targetNode) {
        TreeNode nextNode = null;
        if (targetNode == null) {
            // 如果目标节点不存在,则返回null
            return nextNode;
        }
        /**
         * 中序遍历中当前节点的下一个节点不会出现在左子树上
         * 如果当前节点有右子树,则【下一个节点】必定是右子树的最左的那个节点
         * 如果当前节点没有右子树,1. 如果该节点为其父节点的左子节点,则其
         * 父节点就是【下一个节点】 2 如果该节点为其父节点的右子节点,则需要
         * 一直向上寻找父节点,直到子节点为其父节点的左子节点为止,则其父节点
         * 就是【下一个节点】
         */
        TreeNode rightNode = targetNode.getRight();
        if (rightNode != null) {
            // 如果目标节点的右子树不为空,则寻找其最左节点
            while (rightNode.getLeft() != null) {
                rightNode = rightNode.getLeft();
            }
            nextNode = rightNode;
        } else if (targetNode.getParent() != null) {
            // 如果目标节点的右子树为空,则遍历其父节点
            TreeNode parentNode = targetNode.getParent();
            while (parentNode != null && targetNode == parentNode.getRight()) {
                // 如果父节点不为空且当前的目标节点值为父节点的右子树,则继续循环

                // 将当前的父节点赋给目标节点,
                targetNode = parentNode;
                // 找到当前父节点的父节点
                parentNode = parentNode.getParent();
            }
            /**
             * 跳出循环条件:
             *  parentNode == null, 下一个节点不存在
             *  targetNode != parentNode.getRight() 目标节点不是父节点的右子树
             */
            nextNode = parentNode;
        }
        return nextNode;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Heynchy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值