zoukankan      html  css  js  c++  java
  • leetcode --binary tree

    1. 求深度:

    recursive 遍历左右子树,递归跳出时每次加一。

    int maxDepth(node * root)
    {
         if(roor==NULL)
            return 0;
         int leftdepth=maxDepth(root->leftchild);
         int rightdepth=maxDepth(root->rightchild);
         if(leftdepth>=rightdepth)
           return leftdepth+1;
          else
            return rightdepth+1;  
    }
    

      

    2. 广度搜索

    使用队列

    class Solution {
    public:
        vector<vector<int>> levelOrderBottom(TreeNode* root) {
            vector<vector<int>> result;
            if(!root)
                return result;
            int i=0;
            queue<TreeNode *> q;
            q.push(root);
            
          
            while(!q.empty())
            {
                int c=q.size();
                vector <int> t;
                for(int i=0;i<c;i++)
                {
                    TreeNode *temp;
                    temp=q.front();
                    q.pop();
                t.push_back(temp->val);
                    if(temp->left)
                q.push(temp->left);
                    if(temp->right)
                q.push(temp->right);
               
                }
              result.push_back(t);
            }
             reverse(result.begin(),result.end());
            return result;
        }
    };
    

      3. 二叉查找树

      由于二叉查找树是递归定义的,插入结点的过程是:若原二叉查找树为空,则直接插入;否则,若关键字 k 小于根结点关键字,则插入到左子树中,若关键字 k 大于根结点关键字,则插入到右子树中。

    /**
     * 插入:将关键字k插入到二叉查找树
     */
    int BST_Insert(BSTree &T, int k, Node* parent=NULL)
    {
    	if(T == NULL)
    	{
    		T = (BSTree)malloc(sizeof(Node));
    		T->key = k;
    		T->left = NULL;
    		T->right = NULL;
    		T->parent = parent;
    		return 1;  // 返回1表示成功
    	}
    	else if(k == T->key)
    		return 0;  // 树中存在相同关键字
    	else if(k < T->key)
    		return BST_Insert(T->left, k, T);
    	else
    		return BST_Insert(T->right, k, T);
    }
    

       构造二叉查找树:

    /**
     * 构造:用数组arr[]创建二叉查找树
     */
    void Create_BST(BSTree &T, int arr[], int n)
    {
    	T = NULL;  // 初始时为空树
    	for(int i=0; i<n; ++i)
    		BST_Insert(T, arr[i]);
    }
    

      构造平衡二叉查找树:

    每次找中间值插入:

    class Solution {
    public:
        int insertTree(TreeNode * & tree, int a)
        {
            if(!tree)
            {
              //  cout<<a<<endl;
                tree=new TreeNode(a);
                tree->left=NULL;
                tree->right=NULL;
                return 0;
            }
                
            
            if(a<tree->val)
            {
               return insertTree(tree->left,a);
            }
            else
               return insertTree(tree->right,a);
        }
        
        
        
        
        int createBST(vector<int> &nums, int i,int j,TreeNode* &t)
        {
            if(i<=j&&j<nums.size())
            {
                
            int mid=i+(j-i)/2;
                
            cout<<mid<<"   "<<nums[mid]<<endl;
            insertTree(t,nums[mid]);
            
            createBST(nums,i,mid-1,t);
            createBST(nums,mid+1,j,t);
            }
    
            return 0;
        }
        
        TreeNode* sortedArrayToBST(vector<int>& nums) {
            if(nums.size()==0)
                return NULL;
            TreeNode *r=NULL;
            createBST(nums,0,nums.size()-1,r);
            
            
            /*
            int i,j;
            for(i=0, j=nums.size()-1;i<=mid-1 && j>=mid+1;)
            {
               cout<<i<<"  "<<j<<endl;
                insertTree(r,nums[i]);
                i++;
                insertTree(r,nums[j]);
                j--;
            }
            if(i!=j)
            {
                        if(i==mid-1)
            {
                cout<<nums[i]<<endl;
                insertTree(r,nums[i]);
            }
                
            if(j==0)
            {
                cout<<nums[j]<<endl;
                insertTree(r,nums[j]);
            }
            }
    */
                
            return r;
        }
    };
    

      不好,相当于每次从头遍历一次树, 没有必要。因为小的中间值直接插左边,大的中间值直接插右边

    class Solution {
    private:
        TreeNode* helper(vector<int>& nums,int start,int end){
            if(end<=start){
                return NULL;
            }
            int mid = start + (end-start)/2;
            TreeNode* root = new TreeNode(nums[mid]);
            root->left = helper(nums,start,mid);
            root->right = helper(nums,mid+1,end);
            return root;
        }
    public:
        TreeNode* sortedArrayToBST(vector<int>& nums) {
            return helper(nums,0,nums.size());
        }
    };
    

      

  • 相关阅读:
    iOS开发_当一个控件被添加到父控件中会调用
    iOS_判断应用在前台还是后台
    iOS开发_ SDWebImage先下载图片保存起来,需要时再调用
    WARNING ITMS90901: "Missing fullscreen support for the latest iPad mini display.
    iOS开发_显示带HTML标签的富文本
    iOS开发_WKWebView隐藏滚动条
    iOS_获取应用当前定位授权状态
    iOS开发_判断字符串是否为空的处理
    UIAlertController和UIActivityViewController在ipad中的兼容性问题
    npm run serve报错提示js堆内存不足
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7235729.html
Copyright © 2011-2022 走看看