为了简洁,以下直接访问类的属性,不提供set和get方法,主要目的在于掌握数据结构和算法
树节点类
public class MyTreeNode {
int val;
MyTreeNode LeftTree;
MyTreeNode rightTree;
public MyTreeNode(int val) {
// TODO Auto-generated constructor stub
this.val = val;
this.LeftTree = null;
this.rightTree = null;
}
}
打印树
import java.util.ArrayList;
import java.util.List;
/**
*
* @author WideStar
* @version 2018年5月25日 下午2:47:29
*/
/*import java.util.ArrayList;
import java.util.List;*/
public class TreeUtils {
public static void printTree(MyTreeNode root) {
List<List<String>> data=new ArrayList<>();
int rows=getHeight(root);
int cols=(int)(Math.pow(2, rows)-1);
List<String> rowData=new ArrayList<>();
for(int i=0;i<cols;i++) {
rowData.add(" ");
}
for(int i=0;i<rows;i++) {
//注意这里不要写成data.add(rowData),因为传入的rowData是行集合对象的地址,
//如果后续更新一行的元素,所有行都会变.
data.add(new ArrayList<>(rowData));
}
insertVal(data, root, 0, rows-1, 0, cols-1);
//return data;
for (List<String> temp: data) {
for (String s : temp) {
System.out.print(s);
}
System.out.println();
}
}
//打印树时向集合中合适的位置添加树的节点的值
private static void insertVal(List<List<String>> data,
MyTreeNode root,int nowRow,int rows,int startCol,int endCol){
if(nowRow>rows||root==null) {
return;
}
data.get(nowRow).set((startCol+endCol)/2, Integer.toString(root.val));
insertVal(data, root.LeftTree, nowRow+1, rows, startCol, (startCol+endCol)/2-1);
insertVal(data, root.rightTree, nowRow+1, rows, (startCol+endCol)/2+1, endCol);
}
public static int getHeight(MyTreeNode tree) {
return tree==null?0:1+Math.max(getHeight(tree.LeftTree), getHeight(tree.rightTree));
}
}
例如:
public static void main(String[] args) {
List<List<String>> list = new ArrayList<>();
List<String> tmp = new ArrayList<>();
tmp.add("a");
tmp.add("b");
tmp.add("c");
tmp.add("d");
for (int i = 0; i < 4; i++) {
list.add(tmp);
}
// 上面写成list.add(tmp)而不是list.add(new ArrayList<>(tmp))的话,
// 更新第四行的第二个元素,则每一行的第二个元素都不变成B
list.get(3).set(1, "B");
for (List<String> temp : list) {
for (String string : temp) {
System.out.print(string);
}
System.out.println();
}
}
输出结果为:
aBcd
aBcd
aBcd
aBcd