Loading

使用一维数组创建出完全二叉树

下面直接上代码(我是直接用的for循环初始化开始做的,也可以使用递归解决)
这是树节点类

package com.edu.dataStructure.treeDemo;

import java.util.*;

/**
 * <p>
 * 自己创建的树节点
 * </P>
 *
 */
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }

    public TreeNode() {
    }

    /**
     * <p>
     * 前序遍历:根节点+左节点+右节点
     * </p>
     */
    public void preShow() {
        if (this != null) {
            System.out.print(this.val + "\t");
            if (this.left != null) {
                this.left.preShow();
            }
            if (this.right != null) {
                this.right.preShow();
            }
        }

    }

    /**
     * <p>
     * 中序遍历:左节点+根节点+右节点
     * </p>
     */
    public void midShow() {
        if (this != null) {
            if (this.left != null) {
                this.left.preShow();
            }
            System.out.print(this.val + "\t");
            if (this.right != null) {
                this.right.preShow();
            }
        }
    }

    /**
     * <p>
     * 后序遍历:左节点+右节点+根节点
     * </p>
     */
    public void postShow() {
        if (this != null) {
            if (this.left != null) {
                this.left.preShow();
            }
            if (this.right != null) {
                this.right.preShow();
            }
            System.out.print(this.val + "\t");
        }
    }

    /**
     * <p>
     * 将数组转换为完全二叉树<br>
     * 完全二叉树的特性:<br>
     * 1.第 n 个元素的左子节点为	2 * n + 1   <br>
     * 2.第 n 个元素的右子节点为	2 * n + 2   <br>
     * 3.第 n 个元素的父节点为	(n-1) / 2   <br>
     * </p>
     *
     * @return
     */
    public static TreeNode arraytoCompletebinarytree(int[] arr) {
        if (arr == null || arr.length == 0) {
            return new TreeNode();
        }
        //创建一堆树
        List<TreeNode> treeNodeList = new ArrayList<>(arr.length);
        for (int i = 0; i < arr.length; i++) {
            TreeNode treeNode = new TreeNode(i+1);
            treeNodeList.add(treeNode);
            }
            //开始构建,初始化左树和右树(常识:只要父节点有左右节点)
            for (int i = 0; i < (arr.length - 1) / 2; i++) {
                //左
                if (treeNodeList.get(2 * i + 1) != null) {
                    treeNodeList.get(i).left = treeNodeList.get(2 * i + 1);
                }
                //右
                if (treeNodeList.get(2 * i + 2) != null) {
                treeNodeList.get(i).right = treeNodeList.get(2 * i + 2);
            }
        }
        //最后的一个父节点的右节点要判断所以单独拿出来处理
        int lastIndex = (arr.length - 1) / 2;
        //左
        if (2 * lastIndex + 1 < arr.length) {
            treeNodeList.get(lastIndex).left = treeNodeList.get(2 * lastIndex + 1);
        }
        //右(当数组为奇数的时候才有右节点)
        if (2 * lastIndex + 2 < arr.length) {
            if (arr.length % 2 != 0) {
                treeNodeList.get(lastIndex).right = treeNodeList.get(2 * lastIndex + 2);
            }
        }
        return treeNodeList.get(0);
    }
}

这是测试类

package com.edu.dataStructure.treeDemo;

/**
 * <p>
 * 该类{@link TreeNodeTest} 是{@link TreeNode} 的测试类
 * </p>
 *
 */
public class TreeNodeTest {
    public static void main(String[] args) {
//        TreeNode instanceToTest = getInstanceToTest();
//        instanceToTest.preShow();
        TreeNode.arraytoCompletebinarytree(new int[]{1,2,3,4,5,6,7,8,9}).preShow();
    }

    /**
     * <p>得到一个测试用例</p>
     * @return
     */
    private static TreeNode getInstanceToTest() {
        TreeNode treeNode1=new TreeNode(1);
        TreeNode treeNode2=new TreeNode(2);
        TreeNode treeNode3=new TreeNode(3);
        TreeNode treeNode4=new TreeNode(4);
        TreeNode treeNode5=new TreeNode(5);
        TreeNode treeNode6=new TreeNode(6);
        TreeNode treeNode7=new TreeNode(7);
        TreeNode treeNode8=new TreeNode(8);
        TreeNode treeNode9=new TreeNode(9);
        treeNode1.left=treeNode2;
        treeNode1.right=treeNode3;
        treeNode2.left=treeNode4;
        treeNode2.right=treeNode5;
        treeNode3.left=treeNode6;
        treeNode3.right=treeNode7;
        treeNode4.left=treeNode8;
        treeNode4.right=treeNode9;
        return treeNode1;
    }
}

测试结果如图:在这里插入图片描述

posted @ 2021-01-30 09:03  揸火箭  阅读(234)  评论(0编辑  收藏  举报

Loading