0
点赞
收藏
分享

微信扫一扫

【算法日记】—— 搜索二叉树

目录

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
int n;
int a[10];


int main()
{
	cin >> n;
	int cnt = 1;

	//可以使用字符的方式存储
	// for(int i = 0; i < n;i++)
	// {
	// 	char tmp;
	// 	cin >> tmp;
	// 	a[i] = tmp - '0';
	// }

	//也可以就使用常规的存储方式,然后反转
	int x;
	cin >> x;

	int i = 0;
	int xx = x;
	while(xx)
	{
		a[i++] = xx % 10;
		xx /= 10;
	}

	//反转
	reverse(a,a+n);

	while(prev_permutation(a,a+n)) cnt++;

	cout << cnt<< endl;
	return 0;
}

解法二:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;

const int fac[]={1,1,2,6,24,120,720,5040,40320,362880};//定义康托展开函数中的阶乘 
char s[32];
int n; 

int Contor(char s[],int n)
{
	int ans=0;
	for(int i = 0;i < n;i++)
	{
		int smaller=0;//统计当前位置的右侧的数据中,比当前位置的数据小的个数
		for(int j= i+1 ;j<n;j++)
			if(s[i] > s[j])smaller++;
		//带入康拓展开计算式
		ans += smaller*fac[n-i-1];
	}

	return ans+1;
}

int main()
{
	cin>>n;
	cin>>s;
	cout<<Contor(s,n);

	return 0;
}
 

在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 1010;
char g_paper[N][N],g_word[N][N],g_tmp[N][N];


//模拟旋转
void swapSt(char g_paper[N][N],int n)
{
 	for(int i = 0; i < n;i++)
 		for(int j = 0; j < n;j++)
 			g_tmp[j][n-i-1] = g_paper[i][j];


 	for(int i = 0; i <n;i++)
 		for(int j = 0; j < n; j++)
 			g_paper[i][j] = g_tmp[i][j];
}


//常规的模拟
int main()
{
    int n;
    cin>>n;

    //输入透明纸的状态
    for(int i = 0; i < n;i++)
  		for(int j = 0; j < n;j++)
  			cin >> g_paper[i][j];

    //输入字母表
  	for(int i = 0; i < n;i++)
  		for(int j = 0; j < n;j++)
  			cin >> g_word[i][j];

    //枚举四次转换+统计结果
  	for(int i = 0; i < 4; i++)
  	{
  		for(int j = 0; j <n;j++)
  			for(int k = 0; k < n;k++)
  				if(g_paper[j][k] == 'O') cout << g_word[j][k];


  		//90度抓换
  		swapSt(g_paper,n);
  	}

    return 0;
}

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        //根据二叉树的性质来吧
        //特使情况处理
        if(root ==  nullptr) return nullptr;

       //返回结果 
        if(root->val == val) return root;
        
        //递归进去继续找
        return (val < root->val ? searchBST(root->left,val):searchBST(root->right,val));

    }
};

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int ans = -1;

    void dfs(TreeNode* root, int &k)
    {
        if(!root) return;

            dfs(root->left,k);
            k --;
            if(k == 0) ans = root->val;
            dfs(root->right,k);
    }
    
    int kthSmallest(TreeNode* root, int k) {
        dfs(root,k);

        return ans;
    }
};

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    TreeNode* dfs(vector<int> &nums,int l ,int r)
    {
        //持续找中点值,中点的左边是左子树,右边是右子树
        if(l > r) return nullptr;

        int mid = (l+r) >> 1;
        //将中点处理为一个结点
        TreeNode* root_node = new TreeNode(nums[mid]);
        //中点左边的数据归结为左子树的内容,递归进去按照类似的逻辑处理
        root_node->left = dfs(nums,l,mid-1);
        root_node->right = dfs(nums,mid+1,r);

        return root_node;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        int n = nums.size();
        int l = 0,r = n - 1;

        return dfs(nums,l,r);
    }
};

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    vector<int> tmp;

    TreeNode* dfs(vector<int> &nums,int l,int r)
    {
        if(l > r) return nullptr;

        int mid = (l + r) >> 1;

        TreeNode* node = new TreeNode(nums[mid]);
        //递归去加载平衡二叉树的左子树和右子树
        //比当前中点小的是左子树,比当前中点大的是右子树
        node->left = dfs(nums,l,mid-1);
        node->right = dfs(nums,mid+1,r);

        return node;
    }

    void to_arr(TreeNode *node)
    {
        if(!node) return;
        to_arr(node->left);
        tmp.push_back(node->val);
        to_arr(node->right);
    }
    TreeNode* balanceBST(TreeNode* root) {
        //先把当前的树的信息存放到数组中
        tmp.clear();
        TreeNode* m = root;
        to_arr(m);

        //现在就是和上一题一样的操作了
        int n = tmp.size();
        int l = 0 , r = n-1;
        return dfs(tmp,l,r);

    }
};

在这里插入图片描述

举报

相关推荐

0 条评论