社区首页 >问答首页 >逐层打印BST树

逐层打印BST树
EN

Code Review用户
提问于 2015-10-02 13:50:45
回答 1查看 147关注 0票数 3

请回顾并告诉我可以作出哪些改进:

代码语言:javascript
代码运行次数:0
复制
package trees;

import java.util.LinkedList;
import java.util.Queue;

public class PrintBSTLevelByLevel {


     public static class Node {

        int data;
        Node left;
        Node right;

        Node(int val){

            this.data = val;
            Node left = null;
            Node right = null;

        }
    }

      public void LevelOrderQueue(Node root){

          Queue q = new LinkedList();
          int levelNodes = 0;

          if(root == null) return;
          q.add(root);

          while(!q.isEmpty()){

              levelNodes = q.size();

              while (levelNodes > 0){

                  Node n = (Node)q.remove();
                  System.out.println(""+n.data);
                  if(n.left!= null)
                      q.add(n.left);
                  if(n.right!=null)
                      q.add(n.right);
                  levelNodes--;

              }
              System.out.println("");




          }



          //return null;
      }

    public static void main(String[] args) {

        Node root = new Node(5);

        root.left = new Node(10);
        root.right = new Node(15);
        root.left.left = new Node(20);
        root.left.right = new Node(25);
        root.right.left = new Node(30);
        root.right.right = new Node(35);

        PrintBSTLevelByLevel l = new PrintBSTLevelByLevel();

        System.out.println(" Output by Better Approach : ");
        l.LevelOrderQueue(root);




    }




}
EN

回答 1

Code Review用户

回答已采纳

发布于 2015-10-05 17:58:14

尽管您的代码足以完成当前任务,但我将创建一个完全(或部分)功能良好的Tree类,以便以后可以使用它。另一个类将处理显示。这就是Tree类的样子:

代码语言:javascript
代码运行次数:0
复制
public class Tree<T> {

    private Node rootNode;

    public Tree() {
        rootNode = null;
    }

    public Tree(T rootValue) {
        rootNode = new Node(rootValue);
    }

    public Node getRootNode() {
        return rootNode;
    }

    public Node createNewNode(T value) {
        return new Node(value);
    }

    class Node {

        private T value;
        public Node left = null;
        public Node right = null;

        Node(T value) {
            this.value = value;
        }

        public T getValue() {
            return value;
        }

        public void setValue(T value) {
            this.value = value;
        }

    }

}

这是一个非常基本的Tree类,它具有非常基本的函数,但是它完成了工作。稍后,当您需要Tree类的更多函数时,您可以轻松地去添加它。课堂解释:

  • 默认构造函数(Tree())只将根节点设置为null。
  • 另一个构造函数将使用参数并创建一个新的Node,其中包含参数的值。
  • getRootNode()方法是获取根Node,这样就可以得到其他Nodes,如下所示:
代码语言:javascript
代码运行次数:0
复制
// example
Tree tree = new Tree(10);
// initialization of values
Node someNode = tree.getRootNode().left.right/*etc*/;
  • createNewNode(T value)方法提供了对其他无法访问的Node(T value)构造函数(至少在包之外)的间接访问。虽然这不是必要的,因为您可以让Node的S构造函数公开,这是以后的良好实践。
  • Node类是一个简单的类,它表示一个具有左右节点的节点,以及它的值:。
    • 该值是一个private变量,因此访问它需要getter和setter。再说一遍,尽管您可以只制作value public,但最好不要这样做。
    • 为了便于使用,我将leftright变量公之于众。尽管它与良好实践不同,但也有一些例外情况(一些程序员可能不同意这种说法)。

现在,对于打印组件:

由于我完全重新设计了Tree类,所以我们也必须更改您的方法。为了准确地执行代码所做的工作,下面是新的方法:

代码语言:javascript
代码运行次数:0
复制
public <T> void LevelOrderQueue(Tree<T> tree) {
    if (tree != null) {
        Tree<T>.Node rootNode = tree.getRootNode();
        if (rootNode != null) {
            Queue<Tree<T>.Node> queue = new LinkedList<>();
            int levelNodes = 0;
            queue.add(rootNode);
            while (!queue.isEmpty()) {
                levelNodes = queue.size();
                while (levelNodes > 0) {
                    Tree<T>.Node node = queue.remove();
                    System.out.println(node.getValue());
                    if (node.left != null) {
                        queue.add(node.left);
                    }
                    if (node.right != null) {
                        queue.add(node.right);
                    }
                    levelNodes--;
                }
                System.out.println();
            }
        }
    }

}

注意一些更改:

  • 该方法现在接受的是Tree<T>对象而不是Node对象。
  • 这个方法有两个null检查;第一个检查树,第二个检查根节点。
  • 我为if语句添加了大括号。之所以如此,是因为缺乏支撑可能会导致可怕的、难以识别的错误,这可能会让你连续几天感到沮丧。我找不到我写得更详细的那篇文章,但一旦我找到它,我会把它贴上去。(编辑:找到了!读这里)
  • 我在Queue初始化中添加了泛型。
  • 我删除了Node的演员阵容。当使用泛型时,这是不必要的。
  • 我改了名字。像nodequeue这样的变量名比nq更容易理解。
  • 我把System.out.println("");改成了System.out.println();。有一个不带参数的println()方法。
  • 我把System.out.println(""+n.data);改成了System.out.println(node.value);。开始的""不是必需的,因为System.out.println()会通过类定义的toString()方法(或者在定义它的继承链中的任何类)自动将给定的内容转换为字符串。
  • 我在一些单独的关键字、变量名、大括号、括号等之间添加了更多的空间:这是为了更好的可读性,并遵循Java的约定。如果您不确定,只需在谷歌上搜索"Java约定“即可。
  • 我去掉了空白处。您可以在您喜欢的地方重新添加它们;我喜欢这样的代码。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/106402

复制
相关文章
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )
泛型作用 : 为 类 , 接口 , 方法 提供复用性 , 支持类型不确定的数据类型 ;
韩曙亮
2023/03/28
5.4K0
泛型类、泛型方法、类型通配符的使用
       你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
泰斗贤若如
2019/06/19
3.8K0
ArrayList的toArray()方法为啥不利用泛型返回List的泛型类型的数组探究
有些同学提出“ArrayList的public T[] toArray(T[] a) 带参数的方法支持泛型可以返回参数类型的数组,public Object[] toArray()
明明如月学长
2021/08/31
1.6K0
ArrayList的toArray()方法为啥不利用泛型返回List的泛型类型的数组探究
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ;
韩曙亮
2023/03/29
15.4K0
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
Java如何优雅获取泛型类型
在 Java 开发中,获取泛型这种操作虽不是很常用,但有时确实必须的,比如 将Json 字符串反序列化成对象的时候。今天就来介绍这个操作。
Bug开发工程师
2018/12/24
12.4K0
Java如何优雅获取泛型类型
【Kotlin】泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
2.9K0
Java如何优雅获取泛型类型
在 Java 开发中,获取泛型这种操作虽不是很常用,但有时确实必须的,比如 将Json 字符串反序列化成对象的时候。今天就来介绍这个操作。
好好学java
2019/05/06
6.7K0
Java如何优雅获取泛型类型
Java如何优雅获取泛型类型
在 Java 开发中,获取泛型这种操作虽不是很常用,但有时确实必须的,比如 将Json 字符串反序列化成对象的时候。今天就来介绍这个操作。
Spark学习技巧
2019/05/21
2.7K0
Java如何优雅获取泛型类型
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
给.neter们整理了一份《.NET/C#面试手册》,目前大约4万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点,就当是查缺补漏!
全栈程序员站长
2022/09/14
2.6K0
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
冷环渊
2021/11/29
3.5K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
泛型方法
上一篇章我们出于类型安全的考虑,不建议使用原生类型,用List<?>代替使用,但是List<?>不允许添加除null以外的任何元素,因此我们需要使用泛型方法List<E>,如下: import jav
java达人
2018/01/31
1.3K0
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型类用法 : 使用时先声明泛型 , 如果不声明泛型 , 则表示该类的泛型是 Object 类型 ;
韩曙亮
2023/03/29
10.2K0
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
4.1K0
【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )
泛型方法
泛型方法 http://msdn2.microsoft.com/zh-cn/library/twcad0zb.... Service Locator with Generic Methods 泛型的Foxcop设计规则 Avoid excessive parameters on generic types Collections should implement generic interface Do not declare static members on generic types Do no
张善友
2018/01/22
7150
Java泛型基础(二)泛型接口泛型方法# 总结
泛型可以应用于同一个类,该类可以针对多种类型使用,例如构建一个RedisTemplateService组件,用于处理当前应用中所有对象的缓存操作。这篇文章主要介绍泛型应用于接口、方法和匿名内部类的一些知识点和使用案例,也包括《Java编程思想》中对应的练习题的解读。
阿杜
2018/08/06
3.3K0
Dart中的泛型方法、泛型类、泛型接口
为了能在一个方法里实现传入什么数据类型就返回什么数据类型,可以利用泛型将方法写成下面这样:
越陌度阡
2020/12/10
3.8K0
Dart中的泛型方法、泛型类、泛型接口
Java——泛型基本总结(通配符、泛型接口、泛型方法)
假如,现在定义一个表示坐标的类,Point,属性坐标x,y,但是此类设计特殊,现在由于设计特殊,现在实际使用中有可能出现以下三种结构的数据:
Winter_world
2020/09/25
3.3K1
Java——泛型基本总结(通配符、泛型接口、泛型方法)
切面获取泛型方法T的真实类型
这次是介绍一个使用了Mybatis Pro的项目中遇到的问题。Mybatis是在Spring项目中非常常见的持久层框架。在享受其带来的便利的同时,也给SeriveMock带来了新的挑战。
Antony
2021/08/06
2.4K0
在Feign接口中返回泛型类型——自定义Decoder
前几天对接了一套第三方接口,这几个第三方接口的请求地址一样,请求参数和响应结果中有很多共同的字段,所以就想把这些字段都抽出来,通过Feign定义的接口返回类型直接返回泛型。
DannyHoo
2020/06/28
8.7K0
在Feign接口中返回泛型类型——自定义Decoder
泛型与关联类型
和其他我学过的语言相比较,Rust有一些令人费解的概念。借用,所有权,借用检查这些概念大家应该已经都听说过了,我自己曾花费数小时在生命期问题上,最终不得不放弃抗争,转而采用Clone来解决。
MikeLoveRust
2020/04/07
1.3K0

相似问题

如何使方法返回泛型类型?

56

使方法返回类型为泛型

21

如何使方法的返回类型成为泛型?

76

泛型方法返回泛型类型

11

如何使方法返回泛型方法?

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档