美文网首页
二叉树详解(遇到问题不断更新)

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

作者: Wide_Star | 来源:发表于2018-05-25 15:31 被阅读0次

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

未完待续

相关文章

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

    为了简洁,以下直接访问类的属性,不提供set和get方法,主要目的在于掌握数据结构和算法 树节点类 打印树 例如:...

  • 线段树 SegTree

    created by Dejavu(不断更新中) 概念 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条...

  • 数据结构-二叉树、BST(二分搜索树)

    章节 tree结构简介 二叉树详解 二分搜索树 - Binary Search Tree 1 tree结构简介 t...

  • 前序、中序、后序、层次遍历代码及详解

    为了便于排版,我把它放到自己csdn博客上了 二叉树四种顺序遍历详解 文章主要讲述了二叉树的几种遍历,每种遍历的代...

  • 问题汇总

    遇到问题会不断更新 1、angular2 返回的字符串数据怎么转换成html 双向绑定的数据显示到页面上都会当做字...

  • 二叉树

    链表详解 用链表概念辅助理解二叉树,链表一个结点的后区指向下一个链表结点,前区指向上一个链表结点,线性结构。二叉树...

  • MySQL的InnoDB索引原理详解

    转自:MySQL的InnoDB索引原理详解 1 、搜索二叉树:每个节点有两个子节点,数据量的增大必然导致高度的快速...

  • leetcode每月一题----102二叉树的层序遍历

    102二叉树的层序遍历 BFS详解 BFS广度遍历公式: bfs遍历所需要的数据结构为队列,当需要广度遍历时可先写...

  • 不断更新

    什么叫不断更新,简单点来讲就好比一款软件一样不断更新,不断改朝换代,不断改变优化,这就是不断更新。 不断更新很容易...

  • 二叉树系列之初探

    声明,本文不涉及基础的树知识,主要详解的是二叉树相关的基础知识,为后续了解指定树的结构时奠定基础知识。 什么是二叉...

网友评论

      本文标题:二叉树详解(遇到问题不断更新)

      本文链接:https://www.haomeiwen.com/subject/erqujftx.html