记录下几种创建二叉树的方法,仅java实现。
二叉树结构定义为:
public class Node {
char val;
Node left;
Node right;
public Node(){}
public Node(int val) {
this.val = val;
}
}
输入为一组二叉树先序遍历顺序的字符串(结点元素字符非‘#’、空格、回车),其中空结点都用 # 符号表示。
例如二叉树:
1
/ \
2 3
/ \ /
4 5 6
\ /
7 8
\
9
输入示例为:124#7##58#9###36###
递归创建
public class TreeCreator {
private static List<Character> chs = new ArrayList<>();
private static Iterator<Character> it = null;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine().trim();
for (int i = 0; i < s.length(); i++) {
chs.add(s.charAt(i));
}
it = chs.iterator();
Node root = generateTree();
sc.close();
}
/**
* 读入字符串为先序遍历,空结点都用#表示
*/
private static Node generateTree() {
Node root = null;
if(!it.hasNext()) return null;
char c = it.next();
if (c != '#') {
root = new Node(c);
root.left = generateTree();
root.right = generateTree();
}
return root;
}
非递归创建
/**
* 非递归实现,使用双栈
* @return
*/
public static Node generateTree(String s) {
if (s == null || s.trim().equals("")) return null;
// 第一个字符必须非“#”
Node root = new Node(s.charAt(0));
Stack<Node> nodes = new Stack<>();
Stack<Integer> tag = new Stack<>();
nodes.push(root);
tag.push(0);
for (int i = 1; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '#') {
while (!tag.isEmpty() && tag.peek() == 1) {
tag.pop();
nodes.pop();
}
if (!tag.isEmpty()) {
tag.pop();
tag.push(1);
}
} else {
Node node = new Node(c);
if (!nodes.isEmpty()) {
Node head = nodes.peek();
if (head.left != null || tag.peek() == 1) {
head.right = node;
} else {
head.left = node;
}
}
nodes.push(node);
tag.push(0);
}
}
return root;
}