有序数组放到二叉树 【微软面试100题 第八十六题】

题目要求

  怎样编写一个程序,把一个有序整数数组放到二叉树中?

题目分析

  二叉搜索树:左<中<右。

  因此通过递归,把数组分成两半,左边一半作为左子树然后继续递归,右边一半作为右子树然后继续递归。

代码实现

#include <iostream>
#include <queue>

using namespace std;

typedef struct BinaryTree
{
    struct BinaryTree *left,*right;
    int data;
}BinaryTree;

BinaryTree *ArrayToTree(int *a,int n);
void PrintTree(BinaryTree *root);

int main(void)
{
    int a[] = {2,3,5,6,8,10};
    BinaryTree *tree = ArrayToTree(a,6);
    PrintTree(tree);
    return 0;
}
void PrintTree(BinaryTree *root)
{
    if(root==NULL)
        return ;
    queue<BinaryTree *> queueTemp;
    queueTemp.push(root);
    queueTemp.push(0);
    while(!queueTemp.empty())
    {
        BinaryTree *tmp = queueTemp.front();
        queueTemp.pop();
        if(tmp)
        {
            cout << tmp->data << " ";
            if(tmp->left)
                queueTemp.push(tmp->left);
            if(tmp->right)
                queueTemp.push(tmp->right);
        }
        else if(!queueTemp.empty())
        {
            queueTemp.push(0);
            cout << endl;
        }
    }
}
BinaryTree *ArrayToTreeCore(int *a,int start,int end)
{
    if(start>end)
        return NULL;
    int mid = start + (end-start)/2;
    BinaryTree *root = new BinaryTree;
    root->data = a[mid];
    root->left = ArrayToTreeCore(a,start,mid-1);
    root->right = ArrayToTreeCore(a,mid+1,end);

    return root;
}
BinaryTree *ArrayToTree(int *a,int n)
{
    if(a==NULL || n<=0)
        return NULL;
    return ArrayToTreeCore(a,0,n-1);
}
时间: 2024-10-13 01:51:44

有序数组放到二叉树 【微软面试100题 第八十六题】的相关文章

第八十六题(搜索二叉树建立)

如何编写一个程序,把一个有序整数数组放到二叉树中? 分析:为了让搜索二叉树的查找等操作接近于O(log(n)).我们以有序数组的中间位置的数字作为搜索二叉树的根节点,以其左半部分数据建立搜索二叉树作为根节点的左子树.以其有半部分数据建立搜索二叉树作为根节点的右子树.这是一个递归的定义,因此程序也採用递归实现. #include<iostream> using namespace std; namespace MS100P_86 { struct BSTree { int data; BSTre

华为上机题汇总(十六)

华为上机题汇总(十六) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十六 目录 第七十六题 第七十七题 第七十八题 第七十九题 第八十题 第七十六题 消除类游戏很多,一般横.竖.斜有连续三个及以上相同就可以消除,为降低难度,本题只需要考虑一维的横消除即可, 即在给定的一组数字中(个,用例保证只有个),如果有连续三个及以上的数字相同,则将这些数字消除, 同时如果前一次消除后导致后面连在一起的也有三个及以上的数字相同,需继续消除,最终输出不能消除的剩余的数

code第一部分数组:第十六题 数组表示数,加一操作

code第一部分数组:第十六题  数组表示数,加一操作 Given a number represented as an array of digits, plus one to the number. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <vector> using namespace std; int * addone(int *a,int n) { in

经典算法题每日演练——第十六题 Kruskal算法

原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0,1,2,3,4,5}这样6个节点,我们知道Prim算法构建生成树是从”顶点”这个角度来思考的,然后采用“贪心思想” 来一步步扩大化,最后形成整体最优解,而Kruskal算法有点意思,它是站在”边“这个角度在思考的,首先我有两个集合. 1. 顶点集合(vertexs): 比如M集合中的每个元素都可以认

经典算法题每日演练——第六题 协同推荐SlopeOne 算法

原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为我们服务,在网络上 我们需要同样的一种替代物,如果简简单单的在数据库里面去捞,去比较,几乎是完成不了的,这时我们就需要一种协同推荐算法,来高效的推荐浏览者喜 欢的商品. 一:概念 SlopeOne的思想很简单,就是用均值化的思想来掩盖个体的打分差异,举个例子说明一下: 在这个图中,系统该如何计算“王五“对”电

【leetcode 简单】 第九十六题 最长回文串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字符串的长度不会超过 1010. 示例 1: 输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7. class Solution(object): def longestPalindrome(self, s): &quo

微软面试100题系列算法心得

微软100题系列地址 答案地址 谓之随笔,当是自己在练习此类算法的一些想法,一些心得,一些领悟,一些借鉴,当自引用之时,会附上相应的链接! 题:把二元查找树转变成排序的双向链表(树) 描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 思维过程[个人思维]: 1. 二元查找树是指在任何结点看来,它的左子树上的值要少于当前结点的值,而它的右子树上的值要大于当前结点的值,对于等于的值那就看自己的原则放左子树还是右子树. 2. 关于树的算法必

调整数组顺序使奇数位于偶数前面 【微软面试100题 第五十四题】

题目要求: 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 要求时间复杂度为O(n). 参考资料:剑指offer第14题. 题目分析: 使用两个指针,pBegin和pEnd,pBegin从开头往后遍历,pEnd从结尾往前遍历,当pBegin遇到偶数和pEnd遇到奇数时,交换两个数,然后继续遍历,直到pBegin>pEnd,则结束. 代码实现: #include <iostream> using namespace std; void

找出数组中两个只出现一次的数字 【微软面试100题 第六十一题】

题目要求: 一个整型数组里除了两个数字机之外,其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字.要求时间复杂度O(N).空间复杂度O(1). 参考资料:剑指offer第40题. 题目分析: 已知: 1.两个相同的数字异或的结果为0,即a^a = 0. 2.两个不相同的数字异或的结果的二进制中某一位为1,则这两个数字的二进制中对应位一个为0,一个为1.如3^2 = 1,对于最低位的二进制,3的最低位二进制为1,2的最低位二进制位0,则结果1的最低位二进制肯定为1. 假设原数组中只出现一