蓝桥杯2020年真题:BST插入节点问题

BST插入节点问题

题目

	时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】 
给定一棵包含 N 个节点的二叉树,节点编号是 1 ∼ N。
其中 i 号节点具有 权值 Wi,并且这些节点的权值恰好形成了一棵排序二叉树 (BST)。 
现在给定一个节点编号 K,小明想知道,在这 N 个权值以外,
有多少个整 数 X (即 X 不等于任何 Wi ) 满足:
给编号为 K 的节点增加一个权值为 X 的子 节点,仍可以得到一棵 BST。 
例如在下图中,括号外的数字表示编号、括号内的数字表示权值。
即编号 1∼4 的节点权值依次是 0、10、20、30。

思路

看数据量和内存限制,直接开空间就完事.创建完树,就dfs确定所有值,这个方法最简单。考场上以我的智商肯定
没空去找约束条件 %%%大佬 。我不会写快写,就只有用流包装一下了
这个题,复杂度其实应该是on,空间o1 的做法,但是很不好意思,虽然我写过人体蜈蚣算法,我依旧是个垃圾。

代码

	import java.io.BufferedInputStream;
import java.util.*;

public class bst插入重写 {
	/**
	 * 根据二叉树的性质,建立映射关系,用数组存储所有节点的索引,并根据当前输入值,确定是父节点的左边还是右边
	 * 然后on 复杂度算出需要多少个
	 * */
	public static void main(String[] args) {
		Scanner sc = new Scanner(new BufferedInputStream(System.in));
		int N = sc.nextInt();
		int findNode = sc.nextInt();
		node[] list = new node[N + 1];
		for (int i = 1; i < list.length; i++) {
			if(i==1){
				list[i] = new node(sc.nextInt(), sc.nextInt());
				continue;
			}
			list[i] = new node(sc.nextInt(), sc.nextInt());
			node fa = list[list[i].fa];
			if (list[i].val > fa.val) {
				fa.right = list[i];
			} else {
				fa.left = list[i];
			}

		}
		int findValue=list[findNode].val;
		dfs(list[1]);
		int size=li.size();
		for(int i =0;i li=new ArrayList();
	public static void dfs(node root){
		if(root==null)return ;
		
		dfs(root.left);
		li.add(root.val);

		dfs(root.right);
	}
	public static class node {
		int fa;
		int val;
		node right;
		node left;

		public node(int fa, int val) {
			this.fa = fa;
			this.val = val;
		}
	}
}

你可能感兴趣的:(蓝桥杯真题,蓝桥杯算法,排序)