Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >这个二叉树的InOrder遍历有什么问题?

这个二叉树的InOrder遍历有什么问题?
EN

Stack Overflow用户
提问于 2020-09-01 17:11:08
回答 2查看 103关注 0票数 1

我使用java实现了BinaryTree,并尝试实现了InOrder遍历。我在副本上干运行代码,在这种情况下,它工作得很好,但当我在我的IDE上运行它时,我得到了无限循环。但是为什么呢?请帮帮忙。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class BinaryTree{
    
    class Node{
    
            private int data;
            private Node left, right;
            public Node(int data)
            {
                this.data = data;
                left=null;
                right=null;}
}
    public void inOrderTraversal(Node root)
            {
                Stack<Node> stack = new Stack<>();
                Node temp = root;
                stack.push(root);
                while(!stack.isEmpty())
                {
                    temp = stack.peek();
                    if(temp.left!=null)
                    {
                        stack.push(temp.left);
                    }
                    else
                    {
                        temp = stack.pop();
                        System.out.print(temp.data+" ");
                        if(temp.right!=null)
                        {
                            stack.push(temp.right);
                        }
                    }
                }
            }
    
    public static void main(String[] args) {
    
            Node one = new Node(1);
            Node two = new Node (2);
            Node three = new Node(3);
            Node four = new Node(4);
            Node five = new Node(5);
            Node six = new Node(6);
            one.left = two;
            one.right = three;
            two.left = four;
            two.right = five;
            three.left = six
    
            BinaryTrees bn = new BinaryTrees();
            bn.inOrderTraversal(one);
        }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-01 17:51:33

您的代码以等于oneNode root开头。one左边是twotwo左边是four。在接受else条件之前,遍历会将two然后four推送到堆栈。然后对four执行pop操作,由于four在右侧没有任何内容,因此while循环重新开始。但是现在堆栈的顶部是twotwo左边仍然是four,所以你把four压到堆栈上,这样无限循环就开始了。

您需要一种方法来指示已经被访问过的节点。如果确实必须使用堆栈,则应该向Node类添加一个新属性,如private boolean visited,并将其初始化为false。在每个temp = stack.pop()之后,您需要设置temp.visited = True,并且只推送到尚未访问的堆栈节点上。如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Node {
    private int data;
    private Node left, right;
    private boolean visited;
    public Node(int data) {
        this.data = data;
        left = null;
        right = null;
        visited = false;
    }
}

public void inOrderTraversal(Node root) {
    Stack<Node> stack = new Stack<>();
    Node temp = root;
    stack.push(root);
    while(!stack.isEmpty()) {
        temp = stack.peek();
        if(temp.left != null && !temp.left.visited) {
            stack.push(temp.left);
        } 
        else {
            temp = stack.pop();
            temp.visited = true;
            System.out.print(temp.data + " ");
            
            if(temp.right != null && !temp.right.visited) {
                stack.push(temp.right);
            }
        }
    }
}

更简单的解决方案是使用递归:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void inOrderTraveralRecursive(Node node) {
    if (node == null) {
        return;
    }
    inOrderTraveralRecursive(node.left);
    System.out.print(node.data + " ");
    inOrderTraveralRecursive(node.right);
}
票数 1
EN

Stack Overflow用户

发布于 2020-09-02 04:41:02

为了解决上述问题,我们可以在这里使用队列和堆栈进行实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void inOrderTraversal(Node root) {
        Stack<Node> stack = new Stack<>();
        Queue<Node> out = new LinkedList<>();
        Node temp = root;
        stack.push(root);
        while (!stack.isEmpty()) {
            temp = stack.peek();
            if (temp.left != null && !temp.left.visited) {
                stack.push(temp.left);
            } else {
                temp = stack.pop();
                temp.visited = true;
                out.offer(temp);

                if (temp.right != null && !temp.right.visited) {
                    stack.push(temp.right);
                }
            }
        }
        while(!out.isEmpty())
        {
            Node tempo = out.poll();
            System.out.print(tempo.data+" ");
            tempo.visited=false;
        }
    }

这是正确的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63692420

复制
相关文章
【PY】根据 Excel 中的指示修改 JSON 数据
继上一次友友问了如何处理 Excel 中的数据之后,这次他又遇到了新问题,让我们一起来看看;
sidiot
2023/08/31
2650
【PY】根据 Excel 中的指示修改 JSON 数据
Lua中如何读写JSON
这是常用的方法,通过Lua对字符串进行解析,从而完成JSON的编码及解码。网络上有许多现成的Lua JSON库可以使用。
杜金房
2020/12/21
8.5K0
Lua中如何读写JSON
Lua中的元表和元方法
Lua中每个值都可具有元表。 元表是普通的Lua表,定义了原始值在某些特定操作下的行为。你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征。例如,当数字值作为加法的操作数时,Lua检查其元表中的"__add"字段是否有个函数。如果有,Lua调用它执行加法。
王亚昌
2019/05/26
1.7K0
Lua中的原表介绍及其使用举例
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/03
7570
由表生成代码:mybatis-generator入门
application.properties ## mapper xml 文件地址 mybatis.mapper-locations=classpath\*:mapper/\*Mapper.xml
道可道非常道
2019/05/05
4710
由表生成代码:mybatis-generator入门
lua解析json
Json 一种文本数据格式,具体参见菜鸟教程;  环境搭建 主机Ubuntu 16.04 安装sudo aptitude install lus-cjson 和lua 代码实现 test.json { "str":"hello world", "configs":[{ "user":"ubuntu", "password":"123456", "ip":"192.168.1.12" }, { "use
程序手艺人
2019/02/21
7.4K0
lua表排序
Lua作为一种很强大且轻量级脚本语言的存在,对于掌握其几乎无所不能的Table(其实就是一个Key Value的数据结构,它很像Javascript中的Object,或是PHP中的数组,在别的语言里叫Dict或Map)是十分必要的。对于Lua语言可参见酷壳Lua简明教程这篇Blog。 对于lua的table排序问题,一般的使用大多是按照value值来排序,使用table.sort( needSortTable , func)即可(可以根据自己的需要重写func,否则会根据默认来:默认的情形之下,如果表内既有
晚晴幽草轩轩主
2018/03/27
2.8K0
JSON C# Class Generator —由json字符串生成C#实体类的工具
json作为互联网上轻量便捷的数据传输格式,越来越受到重视。但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率。JSON C# Class Generator 能将json格式所表示的Javascript对象转化成强类型的C#实体类,来实现减少代码输入的效果。
全栈程序员站长
2022/07/21
1K0
redis中的lua
前言 最近在看redis的lua,看了官网资料和网上一些文章,整理了lua的相关内容,希望对大家有帮助。 目录 0. redis中运行lua的流程的正常流程 1.redis中的lua概要信息     1.1 lua中调用redis命令     1.2 redis数据结构与lua数据结构对应关系     1.3 EVAL和EVALSHA     1.4 脚本缓存     1.5 脚本命令     1.6 其他约定         1.6.1 全局变量保护         1.6.2 Sele
温安适
2018/05/17
1.8K0
使用工具优化Lua的table访问
写Lua代码似乎不需要考虑性能,毕竟都用Lua了,如果考虑性能直接用C++不就好了。但是勤俭节约是中华民族传统美德,能省点cpu是一点。特别是在Lua使用越来越多的时候。
esrrhs
2023/03/06
5060
Lua生成的LDoc文档注释规范
函数参数@param 是不指明具体类型的, 若想指明的话可以用 @int, @string, @bool, @func, @tab, @thread 几个标签来.
bering
2020/03/19
4.2K0
Lua-原表
__index元方法 Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
祝你万事顺利
2019/05/31
3850
Lua下的excel配置表极致优化
项目中由于对于启动的优化,配置表量并不是特别大,但启动时长却不低,但对于应用类来说,对启动时长要求很严格。
用户7851139
2022/12/16
8870
Lua 中的常用API
luaL_newstate lua_State *luaL_newstate (void); 创建一个新的state luaL_openlibs void luaL_openlibs (lua_State *L); 打开所有的标准lua库到指定状态,也就是把所有标准类库加载到指定的虚拟机. luaL_loadfile int luaL_loadfile (lua_State *L, const char *filename); 加载文件的时候把它当一个lua模块 luaL_dofile和luaL
程序手艺人
2019/02/21
1.8K0
【游戏开发】小白学Lua——从Lua查找表元素的过程看元表、元方法
在上篇博客中,我们简单地学习了一下Lua的基本语法。其实在Lua中有一个还有一个叫元表的概念,不得不着重地探讨一下。元表在实际地开发中,也是会被极大程度地所使用到。本篇博客,就让我们从Lua查找表元素的过程,来探讨学习一下Lua中的元表。
马三小伙儿
2018/09/12
1.8K0
ASP.NET中的页面指示标识
页面指示标识 的功能是用来确定在处理aspx文件的时候,需要系统做一些什么特殊的设定?它的语法是: <%@ directive attribute=value %>   比如:<%import namespace="System.Data"%>
Java架构师必看
2021/03/22
1.6K0
点击加载更多

相似问题

访问由stringify生成的json

11

在lua C++中访问由表键索引的表

22

如何打印由JSON数据生成的表?

56

嵌套表中的Lua访问表值

21

lua中的Json表拉取

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文