采用递归的方法创建二叉树,可以灵活地创建任意形态的二叉树,这里用先序递归举例,中序和后序同理。
首先贴一下Node节点类,大同小异。
public class Node {
private int data;
private Node lchild;
private Node rchild;
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getLchild() {
return lchild;
}
public void setLchild(Node lchild) {
this.lchild = lchild;
}
public Node getRchild() {
return rchild;
}
public void setRchild(Node rchild) {
this.rchild = rchild;
}
public Node(int data, Node lchild, Node rchild) {
super();
this.data = data;
this.lchild = lchild;
this.rchild = rchild;
}
@Override
public String toString() {
return "Node [data=" + data + ", lchild=" + lchild + ", rchild="
+ rchild + "]";
}
}
下面是递归创建二叉树的方法,代码很简单,为了灵活创建树,用户需要输入每个节点的值,当输入的值为0时,认为这个节点为空。
public Node CreateInRecur(Scanner scanner){
int data = scanner.nextInt();
if(data==0) //输入data为0时,认为该节点为空节点
return null;
Node node =new Node(data,CreateInRecur(scanner),CreateInRecur(scanner));
return node;
}
比如要生成下面这颗树:
用户输入的节点data先后为: 1 2 0 4 0 0 3 5 0 0 0
通过先序遍历打印的方式,得到各个节点的toString如下,说明已经成功创建了树:
Node [data=1, lchild=Node [data=2, lchild=null, rchild=Node [data=4, lchild=null, rchild=null]], rchild=Node [data=3, lchild=Node [data=5, lchild=null, rchild=null], rchild=null]]
Node [data=2, lchild=null, rchild=Node [data=4, lchild=null, rchild=null]]
Node [data=4, lchild=null, rchild=null]
Node [data=3, lchild=Node [data=5, lchild=null, rchild=null], rchild=null]
Node [data=5, lchild=null, rchild=null]
个人觉得这种递归方式创建树很灵活,但是代价就是需要用户手动输入每个节点以决定树的形态。