数组二叉树

  • 二叉树也可以用数组来存储给定一个数组
  • 树的根节点的值储存在下标1, 对于储存在下标n的节点, 他的左子节点和右子节点分别储存在下标2*n和2*n+1
  • 并且我们用-1代表一个节点为空,给定一个数组存储的二叉树,试求从根节点到最小的叶子节点的路径
  • 输入描述
  • 输入一行 为数组的内容 数组的每个元素都是正整数,元素间用空格分割
  • 注意第一个元素即为根节点的值
  • 即数组的第n元素对应下标n
  • 输入的树最多为7层
  • 输出描述
  • 输出从根节点到最小叶子节点的路径上各个节点的值由空格分割
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;

public class Question37 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.useDelimiter("\n");
	  //输入:4 2 6 1 3 5 7 5 6 3 -1 3 1 9 8 9 7 6 9 8 -1 3 2 5 6 7 9 0 8 7 2
	  //输出:4 6 7 9 0
        String str = scanner.next();
        String[] split = str.split(" ");
        int[] arr = new int[split.length];
        for (int i = 0; i < split.length; i++) {
            arr[i] = Integer.parseInt(split[i]);
        }
        new Question37().answer(arr);
    }

    public void answer(int[] arr) {
        Map<Integer, Tree> map = new HashMap<>();
        //按元素创建好节点,以备后面使用
        for (int i = 1; i <= arr.length; i++) {
            if (arr[i - 1] == -1) {
                map.put(i, null);
            } else {
                map.put(i, new Tree(arr[i - 1]));
            }
        }
        //构建二叉树,同时寻找最小叶子节点的坐标
        int[] min = new int[]{0, Integer.MAX_VALUE};
        for (int i = 1; i <= arr.length; i++) {
            if (map.get(i) != null) {
                if (map.containsKey(2 * i) && map.get(2 * i) != null) {
                    map.get(i).left = map.get(2 * i);
                }
                if (map.containsKey(2 * i + 1) && map.get(2 * i + 1) != null) {
                    map.get(i).right = map.get(2 * i + 1);
                }
                if (map.get(i).left == null && map.get(i).right == null && map.get(i).val < min[1]) {
                    min[0] = i;
                    min[1] = map.get(i).val;
                }
            }
        }
        Stack<Integer> stack = new Stack<>();
        int index = min[0];
        stack.push(map.get(index).val);
        while (index > 1) {
            if (index % 2 != 0) {
                index--;
            }
            index /= 2;
            stack.add(map.get(index).val);
        }
	  //格式化输出
        while (!stack.isEmpty()) {
            if (stack.size() != 1) {
                System.out.print(stack.pop() + " ");
            }else {
                System.out.print(stack.pop());
            }
        }
    }
	//中序遍历
    public void order(Tree tree) {
        if (tree.left != null) {
            Tree left = tree.left;
            order(left);
        }
        System.out.println(tree.val);
        if (tree.right != null) {
            Tree right = tree.right;
            order(right);
        }
    }
}
//自定义二叉树
class Tree {
    int val;
    Tree left;
    Tree right;
    public Tree(int val) {
        this.val = val;
    }
}

全部评论

相关推荐

点赞 评论 收藏
转发
头像
05-27 20:32
已编辑
深度学习
工行数据中心 偏运维养老 到手可能18w
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务