考察点:二叉树
实现代码:
import
java.util.ArrayList;
import
java.util.Scanner;
public class Main
{
// 定义节点
class Node{
int val;
Node left;
Node right;
public Node(int val) {
this.val = val;
}
}
public ArrayList<Integer> gzy; // 保存根左右的序列
public ArrayList<Integer> zgy; // 保存左跟右的序列
public ArrayList<Node> pack; // 保存已经排好的节点
public static void main(String[] args) {
Main main = new Main();
main.getResult();
}
public void getResult() {
//init Scanner
scanner = new Scanner(System.in);
int count = scanner.nextInt();
gzy= new ArrayList<>();
zgy= new ArrayList<>();
for(int i = 0; i < count; i++) {
gzy.add(scanner.nextInt());
}
for(int j = 0; j < count; j++) {
zgy.add(scanner.nextInt());
}
pack= new ArrayList<>(); // 已经还原的节点
//exception
if(count== 1) {
System.out.println(gzy.get(0));
return;
}
// 构造最左侧节点的二叉树
Node node = new Node(gzy.get(0));
pack.add(node);
int index1 = 1; // 根左右的下标
Node tmp = node;
while(gzy.get(index1)!= zgy.get(0)) { // 如果没访问到最左边的叶子节点,继续还原最左侧二叉树
tmp.left = new Node(gzy.get(index1++));
tmp = tmp.left;
pack.add(tmp);
}
tmp.left = new Node(gzy.get(index1++));
pack.add(tmp.left);
// 加入剩余的节点完善二叉树
for(int k = index1; k < gzy.size(); k++) {
fillErCS(gzy.get(k));
}
// 层次遍历
ArrayList<Node> res = new ArrayList<>();
res.add(node);
int num = 0;
while(res.size()!= num) {
System.out.print(res.get(num).val + "");
if(res.get(num).left != null) {
res.add(res.get(num).left);
}
if(res.get(num).right != null) {
res.add(res.get(num).right);
}
num++;
}
}
// 将值为val的节点加入二叉树
private void fillErCS(int val) {
int index = zgy.indexOf(val);
// 每一个遍历的节点都是val节点的根或者在其左边
for(int i = index-1; i >= 0; i--) {
if(findNode(zgy.get(i)) != null) { // 找到待插入节点的根节点或者其左边的节点
Node node = findNode(zgy.get(i));
insert(node,val);
break;
}
}
}
// 将节点val插入二叉树
private void insert(Node node, int val) {
if(zgy.indexOf(node.val)> zgy.indexOf(val)) { // node在待插入节点的右边
if(node.left == null) {
node.left= new Node(val);
pack.add(node.left);
return;
}
insert(node.left, val);
}
else{
//node在待插入节点的左边或是其根
if(node.right == null) {
node.right= new Node(val);
pack.add(node.right);
return;
}
insert(node.right, val);
}
}
// 根据val找到pack里的节点
private Node findNode(int val) {
for(Node node : pack) {
if(node.val == val) {
return node;
}
}
return null;
}
}
我一直在尝试从Node切换到Java,我想知道的一件事是如何以类似于Node显示的格式打印对象,例如二叉树。例如,我的二叉树初始化代码如下: 在节点中,此二叉树将显示如下: 然而在Java,当我做system.out.println(树); 输出->BinaryTree@4554617c 什么是打印我的BinaryTree的正确方法?什么是好方法?有没有一种方法可以用JSON格式打印树?
问题内容: 如何在Java中打印二进制树,使输出类似于: 我的节点: 问题答案: 我已经创建了简单的二叉树打印机。你可以根据需要使用和修改它,但是仍然没有对其进行优化。我认为很多事情可以在这里得到改善;) 输出1: 输出2:
我试图打印我的二叉搜索树的每个节点的所有值和深度。我很难想出一种递归计算深度的方法。到目前为止,我有一种仅打印树的每个值的方法。我将不胜感激一些指导,因为我觉得我让它变得比应有的更难。
我有一个python代码来将字符串数学表达式转换为二叉树并对树的节点进行排序,这样左边的孩子总是比右边的孩子小。我想按以下顺序打印二叉树。 例如,考虑数学表达式((2*75)/4)。buildParseTree()将字符串表达式转换为树并printNodeInLevels()重新排列节点,以便在每个级别上左子节点小于右子节点。操作 我想按如下方式打印它。我该怎么办?因为数学表达式的长度一直在变化,
下面是一个二叉查找树,它有一个根节点、一个左节点和一个右节点。代码有效,但我想显示这个二叉查找树,这样我就可以看到图层中的每个节点…这是代码…
我需要打印一个具有深度和从高到低的二叉搜索树,根据深度,在打印节点之前增加破折号的数量。树根用0破折号,她的树梢用1破折号……我可以打印没有破折号的树,但我不知道如何用破折号打印。我用的是C.对不起我的英语不好