层次遍历构造二叉树
给定层次遍历的数组顺序,注意是完全二叉树形态的数组,空节点用 # 号代替。代码如下:
// -----
import java.util.Scanner;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Tree {
String dataString;
public TreeNode creatTreeNode() {
if (dataString.length() <= 0) {
return null;
}
TreeNode[] NodeArray = new TreeNode[dataString.length()];
for (int i = 0; i <= dataString.length() - 1; i++) {
if (dataString.charAt(i) != '#') {
// 这里是个坑,如果不判断就 new, 导致子节点重新创建,爷孙关系就断了, A -->B, C---->D, C
// 是重新创建的节点
if (NodeArray[i] == null) {
NodeArray[i] = new TreeNode(
(int) (dataString.charAt(i) - '0'));
}
int idx = 2 * i + 1;
if (idx <= dataString.length() - 1
&& dataString.charAt(idx) != '#') {
NodeArray[idx] = new TreeNode(
(int) (dataString.charAt(idx) - '0'));
NodeArray[i].left = NodeArray[idx];
} else {
NodeArray[i].left = null;
}
idx++;
if (idx <= dataString.length() - 1
&& dataString.charAt(idx) != '#') {
NodeArray[idx] = new TreeNode(
(int) (dataString.charAt(idx) - '0'));
NodeArray[i].right = NodeArray[idx];
} else {
NodeArray[i].right = null;
}
}
}
return NodeArray[0];
}
public void preOrderTravel(TreeNode node) {
System.out.print(node.val + " ");
if (node.left != null) {
preOrderTravel(node.left);
}
if (node.right != null) {
preOrderTravel(node.right);
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
String temp = "hello sfd worldsdf ";
System.out.println(temp);
Tree mytree = new Tree();
// case 1
// mytree.dataString = "392##57";
// case 2
mytree.dataString = "1#2##3";
TreeNode root = mytree.creatTreeNode();
// 先序遍历
mytree.preOrderTravel(root);
}
}