• PAT-1064 Complete Binary Search Tree(完全二叉树)


    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.
    A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right.

    Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal sequence of this BST.

    Input Specification:
    Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.

    Output Specification:
    For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

    Sample Input:
    10

    1 2 3 4 5 6 7 8 9 0


    Sample Output:

    6 3 8 1 5 7 9 0 2 4


    题目大意:给出一个构成完全二叉树(除了最后一层的右边可能缺少部分节点,其余层均达到最大节点数)的序列,要求输出该完全二叉树的层次遍历。


    主要思想:根据完全二叉树的特性可以用一个数组很方便的表示出来,将根节点的索引设为1,之后每个索引为i的节点,其左节点为2i,右节点为2i+1,然后对于输入的序列进行排序后按照中序遍历依次填入二叉树数组,这样完全二叉树就构造成功了,而最后一步的层次遍历输出其实就是对数组的顺序输出。

    #include <cstdio>
    #include <algorithm>
    int n;						//节点个数
    int index = 0;				//序列数组的索引
    int a[1005];				//输入的序列数组
    int node[1005];				//完全二叉树数组
    using namespace std;
    
    void travel(int i) {
        if (i > n)  return;
        travel(2*i);
        node[i] = a[index++];
        travel(2*i+1);
    }
    
    int main(void) {
        int i;
        
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        sort(a, a+n);
        travel(1);				//中序遍历构造完全二叉树
    	//层次遍历输出
        for (i = 1; i < n; i++)
            printf("%d ", node[i]);
        printf("%d
    ", node[i]);
    
        return 0;
    }
    


  • 相关阅读:
    C语言中字符串常用函数--strcat,strcpy
    linux下core dump【总结】
    C语言memset()函数:将内存的前n个字节设置为特定的值
    const的理解、const指针、指向const的指针
    C99标准的新特性
    ISO C语言新标准(C11)
    哪个版本的gcc才支持c11
    不使用session,借助redis实现验证码
    google浏览器截图工具 Open Screenshot(代码截图)
    springmvc+jpa实现分页的两种方式
  • 原文地址:https://www.cnblogs.com/zhayujie/p/12941577.html
Copyright © 2020-2023  润新知