今天我要分享我学习用广义表生成二叉树的代码 这里我参考了 张二青博主的一些知识 http://my.youkuaiyun.com/zhangerqing
下面我进行分析了 比如输入广义表 (有关字符串的定义可以百度百科看看)String exp="A(F,B(O,J))" 然后对应的树应该是
广义表生成二叉树的规则就是:
遇到字母: 直接生产一个节点;
遇到"(": 下一步生成左孩子的操作
遇到”)“:返回上一层
遇到",": 下一步是生产右孩子的操作
代码贴出
public class BinaryTree {
/*
* 这是输入广义表 然后生产二叉树
*/
public class Node{ //节点类
private char data;
private Node lchild;
private Node rchild;
public Node(){
}
public Node(char data,Node lchild,Node rchild){
this.data=data;
this.lchild=lchild;
this.rchild=rchild;
}
public void setlchild(Node lchild) {
this.lchild = lchild;
}
public void setrchild(Node rchild) {
this.rchild=rchild;
}
public Node getRchild() {
// TODO Auto-generated method stub
return rchild;
}
public Node getLchild() {
// TODO Auto-generated method stub
return lchild;
}
public char getData() {
// TODO Auto-generated method stub
return data;
}
}
public Node creatBinaryTree(String exp){
char[] exps=exp.toCharArray();
Node[] node=new Node[4];
Node curr = null;
int j=0,top=0,type=0;
while(j
switch(exps[j]){
case '(':
node[top]=curr;
type=1;
break;
case ')':
top=top-1;
break;
case ',':
top=top-1;
type=2;
break;
default:
curr=new Node(exps[j],null,null);
switch(type){
case 1:
node[top].setlchild(curr);
top=top+1;
break;
case 2:
node[top].setrchild(curr);
top=top+1;
break;
default:
break;
}
}
j++;
}
return node[0];
}
public void PreOrder(Node node) {
if (node == null) {
return;
} else {
System.out.print(node.getData() + " ");
PreOrder(node.getLchild());
PreOrder(node.getRchild());
}
}
public void LastOrder(Node node){
if (node == null) {
return;
}
else{
LastOrder(node.getLchild());
LastOrder(node.getRchild());
System.out.print(node.getData() + " ");
}
}
public void CneterOrder(Node node){
if (node == null) {
return;
}
else{
LastOrder(node.getLchild());
System.out.print(node.getData() + " ");
LastOrder(node.getRchild());
}
}
public static void main(String[] args) {
BinaryTree tree=new BinaryTree();
System.out.println("PreOrder:");
tree.PreOrder(tree.creatBinaryTree("A(F,B(O,J))"));
System.out.println("\nLastOrder:");
tree.LastOrder(tree.creatBinaryTree("A(F,B(O,J))"));
System.out.println("\nCenterOrder:");
tree.CneterOrder(tree.creatBinaryTree("A(F,B(O,J))"));
}
}
输出:
PreOrder:
A F B O J
LastOrder:
F O J B A
CenterOrder:
F A O J B