思路:用了两个栈,leftStack和rightStack,分别存放左结点和右结点。
import java.util.Scanner;
import java.util.Stack;
public class 字符串得二叉树中序遍历 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
TreeNode root = buildTree(s);
middiumPrint(root);
}
static Stack<TreeNode> nodeRightStack = new Stack<>();
static Stack<TreeNode> nodeLeftStack = new Stack<>();
static TreeNode buildTree(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '}') {
TreeNode rightNode = null;
TreeNode leftNode = null;
while (stack.peek() != '{') {
if (isLetter(stack.peek())) {
char temp = stack.pop();// 判断是否只有一个字母
if (stack.peek() != ',') {// 是
leftNode = new TreeNode();
leftNode.val = temp;
} else {
stack.push(temp);// 不是,放回去
if (!nodeRightStack.isEmpty()) {
stack.pop();
rightNode = nodeRightStack.pop();
} else {
char temp_ = stack.pop();
rightNode = new TreeNode();
rightNode.val = temp_;
}
if (stack.peek() == ',') {
stack.pop();
if (isLetter(stack.peek())) {
if (!nodeLeftStack.isEmpty()) {
stack.pop();
leftNode = nodeLeftStack.pop();
} else {
char temp_ = stack.pop();
leftNode = new TreeNode();
leftNode.val = temp_;
}
}
}
}
}
}
if (stack.peek() == '{') {
stack.pop();
char temp = stack.pop();
TreeNode parentNode = new TreeNode();
parentNode.val = temp;
parentNode.left = leftNode;
parentNode.right = rightNode;
if (stack.isEmpty()) {
return parentNode;
}
if (stack.peek() == ',') {
nodeRightStack.push(parentNode);
} else {
nodeLeftStack.push(parentNode);
}
stack.push(temp);
}
} else {
stack.push(c);
}
}
return nodeLeftStack.pop();
}
static boolean isLetter(Character c) {
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
return true;
} else {
return false;
}
}
static void middiumPrint(TreeNode node) {
if (node.left != null) {
middiumPrint(node.left);
}
System.out.print(node.val + " ");
if (node.right != null) {
middiumPrint(node.right);
}
}
}