给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。(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月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
8天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
21 4
|
11天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
21天前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
18 3
|
29天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
42 3
|
1月前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
49 4
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
19 1
|
20天前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
14 0
|
1月前
|
分布式计算 安全 Java
Java语言的特点?
Java语言的特点?
树的遍历:迭代 & 递归|Java 刷题打卡
树的遍历:迭代 & 递归|Java 刷题打卡