二叉树详解(遇到问题不断更新)

2018-05-25  本文已影响0人  Wide_Star

为了简洁,以下直接访问类的属性,不提供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

未完待续

上一篇 下一篇

猜你喜欢

热点阅读