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());
    }
};

  

 

posted @ 2017-07-25 18:16  hahahaf  阅读(130)  评论(0编辑  收藏  举报