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

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

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


这是剑指Offer的题目,我的思路是这样的,就是把中序遍历的节点依次添加进ArrayList中,然后遍历ArrayList,找到目标节点的下一个节点就可以返回了,下面是我思路的代码实现。

package Day43;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * @Author Zhongger
 * @Description 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
 * @Date 2020.3.15
 */
public class GetNextSolution {
    public  List<TreeLinkNode> treeNodeArrayList = new ArrayList<>();
    public static void main(String[] args) {
        GetNextSolution getNextSolution = new GetNextSolution();
        TreeLinkNode root = new TreeLinkNode(8);
        TreeLinkNode node6 = new TreeLinkNode(6);
        TreeLinkNode node10 = new TreeLinkNode(10);
        TreeLinkNode node5 = new TreeLinkNode(5);
        TreeLinkNode node7 = new TreeLinkNode(7);
        TreeLinkNode node9 = new TreeLinkNode(9);
        TreeLinkNode node11 = new TreeLinkNode(11);
        root.left=node6;
        root.right=node10;
        node6.left=node5;
        node6.right=node7;
        node10.left=node9;
        node10.right=node11;
        System.out.println(getNextSolution.infixOrder(root));
        System.out.println(getNextSolution.GetNext(root));
    }
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if (pNode==null){
            return null;
        }
        if (treeNodeArrayList.get(treeNodeArrayList.size()-1).val==pNode.val){//中序遍历序列中,pNode恰好是最后一个节点,那它的下一个节点就为空
            return null;
        }
        Iterator<TreeLinkNode> iterator = treeNodeArrayList.iterator();//迭代器
        while (iterator.hasNext()){
            TreeLinkNode next = iterator.next();
            if (next.val==pNode.val){//当前节点值与传入的节点值相同
                return iterator.next();
            }
        }
        return null;
    }
    public List<TreeLinkNode> infixOrder(TreeLinkNode root){//中序遍历
        if (root.left!=null){
            infixOrder(root.left);
        }
        System.out.println(root);
        treeNodeArrayList.add(root);
        if (root.right!=null){
            infixOrder(root.right);
        }
        return treeNodeArrayList;
    }
}
class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;
    TreeLinkNode(int val) {
        this.val = val;
    }
    @Override
    public String toString() {
        return "TreeLinkNode{" +
                "val=" + val +
                '}';
    }
}

我在自己的IDEA中调试过,输出的结果是没有问题的,但是在牛客网上提交,就通不过,例如下面这个测试用例:

image.png


但我在IDEA中调试的结果是:


image.png


显然是可以得到结果9的。实在没有办法,只能去评论区求助大佬,另外我还是不明白,节点类中的next指针有什么作用,它是指向当前节点的父节点的。这是能够通过的代码:

  public TreeLinkNode GetNext(TreeLinkNode pNode){
        if (pNode==null){
            return null;
        }
        if (pNode.right != null) {//当前节点有右子节点,那么当前节点的下一个节点就是它右子节点的最左子节点
            TreeLinkNode node = pNode.right;
            while (node.left != null)
                node = node.left;
            return node;  //找到了最左节点后,就把结果节点指向它,然后返回
        } else { //当前节点没有右子节点
            while (pNode.next != null) { //沿着父节点的指针遍历,直到找到一个节点成为它的父节点的左子节点
                TreeLinkNode parent = pNode.next;
                if (parent.left == pNode)
                    return parent;
                pNode = pNode.next;
            }
        }
        return null;
    }


通过刷题,我发现我还是太菜了点,想问题想得不够深入,没有利用到二叉树中序遍历的特征来进行求解。

相关文章
|
1月前
|
数据采集 分布式计算 大数据
Java语言在大数据处理中的应用
传统的大数据处理往往依赖于庞大的数据中心和高性能的服务器,然而随着大数据时代的到来,Java作为一种强大的编程语言正在被广泛应用于大数据处理领域。本文将探讨Java语言在大数据处理中的优势和应用,以及其在分布式计算、数据处理和系统集成等方面的重要作用。
|
1天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
8天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
8天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
147 10
|
13天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
24天前
|
Java
Java语言打印九九乘法表(详解)
Java语言打印九九乘法表(详解)
15 1
Java语言打印九九乘法表(详解)
|
1月前
|
Java API 开发工具
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(三)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
30 0
|
1月前
|
Java 数据处理 数据库
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(二)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
34 0
|
1月前
|
存储 算法 Java
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(一)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
34 0