zoukankan      html  css  js  c++  java
  • careercup-树与图 4.3

    4.3 给定一个有序整数数组,元素各不相同按升序排列,编写一个算法,创建一棵高度最小的二叉查找树。

    解答

    想要使构建出来的二叉树高度最小,那么对于任意结点, 它的左子树和右子树的结点数量应该相当。比如,当我们将一个数放在根结点, 那么理想情况是,我们把数组中剩下的数对半分,一半放在根结点的左子树, 另一半放在根结点的右子树。我们可以定义不同的规则来决定这些数怎样对半分, 不过最简单的方法就是取得有序数组中中间那个数,然后把小于它的放在它的左子树, 大于它的放在它的右子树。不断地递归操作即可构造这样一棵最小高度二叉树。

    与leetcode类似题目:https://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/

    C++实现代码:

    #include<vector>
    #include<iostream>
    using namespace std;
    
    struct TreeNode
    {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    TreeNode* helper(vector<int>::iterator begin,vector<int>::iterator end)
    {
        TreeNode *root=NULL;
        if(begin+1==end)
            return new TreeNode(*begin);
        if(begin>=end)
            return NULL;
        int mid=(end-begin)/2;
        root=new TreeNode(*begin+mid);
        root->left=helper(begin,begin+mid);
        root->right=helper(begin+mid+1,end);
        return root;
    }
    
    TreeNode* createAVL(vector<int> &vec)
    {
        if(vec.empty())
            return NULL;
        return helper(vec.begin(),vec.end());
    }
    
    void inorder(TreeNode *root)
    {
        if(root)
        {
            inorder(root->left);
            cout<<root->val<<" ";
            inorder(root->right);
        }
    }
    int maxDepth(TreeNode *root)
    {
        if(root)
        {
            if(root->left==NULL&&root->right==NULL)
                return 1;
            int leftDepth=maxDepth(root->left);
            int rightDepth=maxDepth(root->right);
            return leftDepth>= rightDepth ?(leftDepth+1):(rightDepth+1);
        }
        return 0;
    }
    int main()
    {
        vector<int> vec= {1,2,3,4,5,6,7,8,9,10};
        TreeNode *root=createAVL(vec);
        inorder(root);
        cout<<endl;
        cout<<maxDepth(root)<<endl;
    }
  • 相关阅读:
    express框架总结
    http协议和file协议的区别
    苹果和安卓机的兼容问题
    nodejs搭建服务器
    VsCode编辑器
    编辑器统一 快捷键
    前后端分离 方案
    资源
    commonJs的运行时加载和es6的编译时加载
    mock 数据 解决方案
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4147940.html
Copyright © 2011-2022 走看看