TreeNode实用方法

TreeNode实用方法

  因为刷题的时候经常碰到树相关的题目,但是测试的时候老不方便了,总不能每次都一个节点一个节点去new吧!当然我开始就是这么做的,后来实在是懒得写一大堆测试代码,就写了俩方法,一个根据数组生成节点,一个遍历获取节点的所有子节点,并保存为字符串。

treeToString 获取输出树节点以及所有子节点并生成字符串
convertArrToTree 数组生成树

package com.radish.leetcode.tree;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description
 * @Author Radish
 * @Date 2020/3/13
 */

public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int x) { val = x; }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

    /**
     *
     * @param depth 当前要找的是第几层
     * @param nodes
     */
    public void getStr(int depth, List<TreeNode> nodes) {
        int nodeCount = 0;
        //从头到depth-1层的元素数量
        int nums = (int)Math.pow(2,depth-1) - 1;
        //depth-1层元素数量
        int nums1 = (int)Math.pow(2,depth - 2);
        //第depth-1层第一个元素下标值
        int i = nums - nums1;
        //那就不是深度优先遍历而是广度优先遍历了嗷
        TreeNode node;
        for (; i < nums; i++) {
            node = nodes.get(i);
            if (node == null) {
                nodes.add(null);nodes.add(null);
            } else {
                if ((node.left != null && (node.left.left != null || node.left.right != null)) ||
                        (node.right != null && (node.right.left != null || node.right.right != null))) nodeCount++;
                nodes.add(node.left);nodes.add(node.right);
            }
        }
        if (nodeCount > 0) getStr(depth + 1, nodes);
    }

    @Override
    public String toString() {
        return String.valueOf(val);
    }

    /**
     * 层序遍历一棵树的元素并转化为字符串
     * @param node
     * @return
     */
    public static String treeToString(TreeNode node) {
        //每一层遍历并输出
        List<TreeNode> nodes = new ArrayList<>();
        nodes.add(node);
        if (node.left != null || node.right != null) { node.getStr(2,nodes);}
        return nodes.toString();
    }

    /**
     * 将数组转化为一棵树,层序遍历
     * @param nums
     * @return
     */
    public static TreeNode convertArrToTree(Integer[] nums) {
        TreeNode[] nodes = new TreeNode[nums.length];
        //获取层数,根据层数,创建每一层元素,创建好的节点放到数组里,方便
        double depth = (Math.log(nums.length + 1) / Math.log(2));
//        if (depth > (int)depth) depth = (int)depth + 1;
        for (int i = nums.length - 1; i >= 0; i--) {
            if (nums[i] == null) nodes[i] = null;
            else {
                nodes[i] = new TreeNode(nums[i]);
                //获取节点深度
//                double vv = Math.log(i + 1) / Math.log(2);
//                int v = vv > (int)vv ? (int)vv + 1 : (int) vv + 1;
                //获取左右节点
                if (nums.length > (2 * i + 1)) {
                    nodes[i].left = nodes[2 * i + 1];
                }
                if (nums.length > (2 * i + 2)) {
                    nodes[i].right = nodes[2 * i + 2];
                }
            }
        }
        return nodes[0];
    }
}

这个代码写的有点罗里吧嗦的…刚开始还搞出了几个bug,不过经过一段时间的使用,并没有啥问题,我想应该ok了!

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值