A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 权跃杰 中级黑马   /  2012-8-12 20:24  /  1739 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 权跃杰 于 2012-8-12 20:25 编辑

package cn.it;
class BinaryTree {// BinaryTree类开始
class Node {// Node类开始
  private Comparable data;
  private Node left;
  private Node right;
  Node(Comparable data) {
   this.data = data;
  }
  public void addNode(Node newNode) {
   if (newNode.data.compareTo(this.data) < 0) {//如果小于0放到左子树上
    if (this.left == null) {//如果没有左子树,则放到第一个
     this.left = newNode;
    } else {//继续向下断送
     this.left.addNode(newNode);
    }
   }
   if (newNode.data.compareTo(this.data) >= 0) {//如果大于等于0放到右子树上
    if (this.right == null) {//如果没有右子树,则放到第一个
     this.right = newNode;
    } else {//继续向下断送
     this.right.addNode(newNode);
    }
   }
  }
  public void printNode() {// 采用中序遍历的方法
   if (this.left != null) {
    this.left.printNode();
   }
   System.out.println(this.data);
   if (this.right != null) {
    this.right.printNode();
   }
  }
}// Node类结束
private Node root;
public void add(Comparable data) {
  Node newNode = new Node(data);
  if (this.root == null) {
   this.root = newNode;
  } else {
   this.root.addNode(newNode);
  }
}
public void print() {
  this.root.printNode();
}
}// binaryTree类结束
public class Demo01 {
public static void main(String[] args) {
  BinaryTree bt = new BinaryTree();
  bt.add(7);
  bt.add(5);
  bt.add(3);
  bt.add(8);
  bt.add(13);
  bt.add(12);
  bt.add(15);
  bt.print();
}//main 方法结束
}//Demo01类结束

这个程序有一点不明白,就是 这个打印数据不明白,
public void printNode() {// 采用中序遍历的方法
   if (this.left != null) {
    this.left.printNode();
   }
   System.out.println(this.data);
   if (this.right != null) {
    this.right.printNode();
   }
}

它先判断。this.root.printNode()    判断根节点9,有没有左子树吧,
如果有(6),则继续向下,判断6,有没有左子树,有5 继续向下判断,    5没有左子树了,System.out.println(this.data);把5打印出来了,,,可是问题来了,
然后执行  if (this.right != null) {
    this.right.printNode();
   }     这代码,可是这个代码,,怎么执行呢,
this.right    5.right  
   5没有右子树呀,它是怎么向下,一直把数据打印出来了,

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

1 个回复

正序浏览
5没有右子树,所以此时this.right=null,因为你在定义时right定义的时一个类的对象,它的下面没有子节点了,那么在创建二叉树的时候没有给它赋值,那么它的默认值就为null,所以if里面的语句就不会执行,这时这函数就执行完了。它也就时递归的出口,然后它会返回到上一层调用它的函数执行,这样一直一步一步往回执行,知道递归函数的入口函数执行完,就实现了打印功能。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马