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;
    }
  • 相关阅读:
    【Lintcode】112.Remove Duplicates from Sorted List
    【Lintcode】087.Remove Node in Binary Search Tree
    【Lintcode】011.Search Range in Binary Search Tree
    【Lintcode】095.Validate Binary Search Tree
    【Lintcode】069.Binary Tree Level Order Traversal
    【Lintcode】088.Lowest Common Ancestor
    【Lintcode】094.Binary Tree Maximum Path Sum
    【算法总结】二叉树
    库(静态库和动态库)
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4147940.html
Copyright © 2011-2022 走看看