先看一些基本概念
1.结点的度
结点拥有的子树数目称为结点的度
2.二叉树
结点的度最大为2,而且左子树和右子树是有顺序的,不能随意改变
3.广义表创建二叉树:
广义表的的约定如下:
1.表中的一个字母表示一个结点的数据信息
2.每个结点的左子树与右子树之间用逗号隔开;如果只有右子树而无左子树,则逗号不能省略。左右子树存在于括号中
A(B(C(,E),D),F(G,))表示的树为:
首先分析算法的过程:
1)遇到(,则说明前一个结点一定是父节点,而且接下来处理的是左结点
2)遇到,则说明即将处理右节点
3)遇到)说明一颗子树已处理完
4)遇到字母,则表示是一个结点
代码如下:
//先创建二叉树:
public class BinaryTree {
private String data;
private BinaryTree left;
private BinaryTree right;
public BinaryTree(String data) {
this.data = data;
}
public BinaryTree() {
}
//get、set省略
}
广义表创建二叉树:
//广义表初始化树
public BinaryTree init(String s) {
BinaryTree root = null; //根节点
BinaryTree node = null; //当前结点
char c;
Stack stack = new Stack();
int k = 0; //1表示左子树,2表示右子树
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (c == '(') {
stack.push(node);
k = 1;
} else if (c == ',') {
k = 2;
} else if (c == ')') {
node = (BinaryTree) stack.pop();
} else {
node = new BinaryTree(String.valueOf(c));
if (null == root) {
root = node;
}else {
BinaryTree temp = (BinaryTree) stack.peek();
if (k == 1) {
temp.setLeft(node);
}
if (k == 2) {
temp.setRight(node);
}
}
}
}
return root;
}
//树的中序打印
private void midPrint(BinaryTree root) {
if (root == null) {
return;
}
midPrint(root.left);
System.out.println(root.getData());
midPrint(root.right);
}
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
binaryTree = binaryTree.init("A(B(C(,E),D),F(G,))");
binaryTree.midPrint(binaryTree);
}
打印结果:
Connected to the target VM, address: '127.0.0.1:51015', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:51015', transport: 'socket'
C
E
B
D
A
G
F
Process finished with exit code 0
来源:oschina
链接:https://my.oschina.net/wuyiyi/blog/3140892