java循环输出abcd_利用JAVA 先序建立二叉树 #表示空树。例如输入ABC##DE#G##F### 先序遍历输出ABCDEGF 我写的程序不能输出...

满意答案

00e27ab806e4881f8254fe7ae8741834.png

vsxgecrr

2017.12.16

00e27ab806e4881f8254fe7ae8741834.png

采纳率:42%    等级:8

已帮助:461人

你的程序有诸多问题,你的程序运行时候应该也会报错的吧?

这个写法不是很通用,不过我还是按照你的源码修改成了你想要的结果。

结构上基本一致,可实现基本已经面目全非了。

我用字符串代替了手工输入,你要是喜欢手工输入,你可以把我那个注释掉,用你自己的……

以下是修改后可用的代码:

import java.util.*;

class Node {

Node left;

Node Right;

char data;// 节点数据

void print() {

System.out.println(data + "");

}

public Node() {

this.left = null;

this.Right = null;

}

public Node(char data) {

this.left = null;

this.Right = null;

this.data = data;

}

}

class BTree {

static Node root = new Node();// 为根节点分配空间

static char ch[];// 输入的字符串

static int i = 0;

static Node CreateTree()// 先序建立二叉树

{

Node node = null;

if (ch[i] == '#') {

node = null;

i++;

}else {

node = new Node();

node.data = ch[i];

i++;

node.left = CreateTree();

node.Right = CreateTree();

}

return node;

}

static public void preorder(Node node)// 先序遍历二叉树

{

if (node != null) {

node.print();

preorder(node.left);

preorder(node.Right);

} else {

System.out.println("Tree node is empty");

}

}

}

public class Tree {

public static void main(String args[]) {

Scanner reader = new Scanner(System.in);

BTree.ch = new char[16];

BTree.ch[0] = 'a';

// 读取输入字符数组,以*结尾

BTree.ch = "ABC##DE#G##F###".toCharArray();

//for (int i = 0; (BTree.ch[i] = reader.next().charAt(0)) != '*'; i++){}

BTree.root = BTree.CreateTree();

BTree.preorder(BTree.root);

}

}追问: static Node CreateTree()// 先序建立二叉树

{

Node node = null;

if (ch[i] == '#') {

node = null;

i++;

}else {

node = new Node();

node.data = ch[i];

i++;

node.left = CreateTree();

node.Right = CreateTree();

}

return node;

}

递归看不太明白,我看别人都是把节点当做参数传进递归函数里CreateTree(node.left); 你用赋值的话节点之间怎么联系起来啊?

追答:“别人”你指的应该是其他编程语言吧?java传递的时候传递的是引用,而且你的node没有父节点的引用,你传入node.left的时候,node.left可值可是null哦,所以,node.left一直是null

你在方法里面new的node只是局部变量,为了得到这个临时生成的node,只能通过方法return来转换一下思路,得到这个node的引用,赋值给node.left,这就是这里这个写法的原因

而没有使用void

01分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值