首页 > 试题广场 >

Build A Binary Search Tree (30

[编程题]Build A Binary Search Tree (30
  • 热度指数:4267 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
The left subtree of a node contains only nodes with keys less than the node's key.
The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
Both the left and right subtrees must also be binary search trees.

Given the structure of a binary tree and a sequence of distinct integer keys, there is only one way to fill these keys into the tree so that the resulting tree satisfies the definition of a BST. You are supposed to output the level order traversal sequence of that tree. The sample is illustrated by Figure 1 and 2.



输入描述:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=100) which is the total number of nodes in the tree. The next N lines each contains the left and the right children of a node in the format "left_index right_index", provided that the nodes are numbered from 0 to N-1, and 0 is always the root. If one child is missing, then -1 will represent the NULL child pointer. Finally N distinct integer keys are given in the last line.



输出描述:

For each test case, print in one line the level order traversal sequence of that tree. All the numbers must be separated by a space, with no extra space at the end of the line.

示例1

输入

<pre>
9
1 6
2 3
-1 -1
-1 4
5 -1
-1 -1
7 -1
-1 8
-1 -1
73 45 11 58 82 25 67 38 42
</pre>

输出

<pre>
58 25 82 11 38 67 45 73 42
</pre>

树结点按顺序存在数组里,然后按顺序构造二叉树,根据BST中序遍历有序性的特点,给各结点赋权值,最后层序遍历输出。

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

public class Main {
    public static void main(String[] args) {
        try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))){
            int n = Integer.parseInt(br.readLine());
            Node[] nodes = new Node[n];
            for (int i = 0; i < n; ++i) {
                nodes[i] = new Node(i);
            }
            for (int i = 0; i < n; ++i) {
                int[] line = Arrays.stream(br.readLine().split(" "))
                                    .mapToInt(Integer::parseInt)
                                    .toArray();
                if (line[0] != -1) {
                    nodes[i].setLeft(nodes[line[0]]);
                }
                if (line[1] != -1) {
                    nodes[i].setRight(nodes[line[1]]);
                }
            }
            int[] sortedWeights = Arrays.stream(br.readLine().split(" "))
                                        .mapToInt(Integer::parseInt)
                                        .sorted()
                                        .toArray();
            Main m = new Main();
            List<Integer> list = new ArrayList<>();
            m.InOrder(nodes[0], list);
            for (int i = 0; i < n; ++i) {
                nodes[list.get(i)].setWeight(sortedWeights[i]);
            }
            m.levelOrder(nodes[0]);
        } catch (IOException e) {}

    }

    public void InOrder(Node root, List<Integer> list) {
        if (root == null) {
            return;
        }
        InOrder(root.left, list);
        list.add(root.no);
        InOrder(root.right, list);
    }

    public void levelOrder(Node root) {
        LinkedList<Node> queue = new LinkedList<>();
        queue.offer(root);
        StringBuilder sb = new StringBuilder();
        while (!queue.isEmpty()) {
            Node cur = queue.poll();
            sb.append(cur.weight).append(" ");
            if (cur.left != null) {
                queue.offer(cur.left);
            }
            if (cur.right != null) {
                queue.offer(cur.right);
            }
        }
        System.out.println(sb.toString().trim());
    }
}

class Node {
    public Node left = null, right = null;
    public int weight, no;
    public Node(int no) {
        this.no = no;
    }
    public void setLeft(Node left) {
        this.left = left;
    }
    public void setRight(Node right) {
        this.right = right;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
}
发表于 2025-01-18 14:09:55 回复(0)
链接:https://www.nowcoder.com/questionTerminal/e89e5714212a4625952d6a248316bfd3?commentTags=C%2FC%2B%2B
来源:牛客网

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define Null -1
usingnamespacestd;
structtree{
   intleft;
   intright;
   intdata;
};
intmain(){
   intN;
   cin>>N;
   intkeys[N];
   tree Tree[N];
   vector<int> v;
   queue<int> q;
   vector<tree> order;
   for(inti=0;i<N;i++){
       cin>>Tree[i].left>>Tree[i].right;
   }
   for(inti=0;i<N;i++){
       cin>>keys[i];
   }
   sort(keys,keys+N);
   intT = 0,i=0;
   while(T!=-1||!v.empty()){
       while(T!=-1){
           v.push_back(T);
           T = Tree[T].left;
       }
       if(!v.empty()){
           T = v.back();
           v.pop_back();
           Tree[T].data = keys[i];
           i++;
           T = Tree[T].right;
       }
   }
   T = 0;
   q.push(T);
   while(!q.empty()){
       T = q.front();
       if(Tree[T].left!=Null)
       q.push(Tree[T].left);
       if(Tree[T].right!=Null)
       q.push(Tree[T].right);
       cout<<Tree[T].data;
       if(q.size()>1)
           cout<<" ";
     q.pop();
   }
}

发表于 2017-09-07 13:36:24 回复(0)