二叉搜索树(两个是否为同一个??)

解题思路:


输入:5 6 7 4 3 2
pre:5 4 3 2 6 7
in:2 3 4 5 6 7
posts:2 3 4 7 6 5

输入:5 4 3 2 6 7
pre:5 4 3 2 6 7
in:2 3 4 5 6 7
post:2 3 4 7 6 5

输入:5 7 6 3 4 2
pre:5 3 2 4 7 6
in:2 3 4 5 6 7
post:2 4 3 6 7 5

.

两个相同数字的排序二叉树的中序遍历一定是相同的,是从小到大排列

我们只需要遍历比较两个二叉树的前序遍历或者后序遍历即可,比较每个位置的元素是否相同。

中+前  中+后 可以确定是否为同一个数。

 

 

 

题目描述

判断两序列是否为同一二叉搜索树序列

输入描述:

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

输出描述:

如果序列相同则输出YES,否则输出NO

示例1

输入

2
567432
543267
576342
0

输出

YES
NO
#include <iostream>
#include <cstdlib>
using namespace std;

string oriRes;
string contrastRes;


typedef struct Node {
	int data;
	struct Node* pLeftChild;
	struct Node* pRightChild;
} Node, * PNode;


void insert(PNode& pT,int k) {
	if (pT == NULL) {
		pT = (PNode)malloc(sizeof(Node));
		pT->data = k;
		pT->pLeftChild = pT->pRightChild = NULL;
		return ;
	}
	int value = pT->data;
	if (k == value) {
		return ;
	} else if (k < value) {
		insert(pT->pLeftChild, k);
	} else {
		insert(pT->pRightChild, k);
	}

}


void preorder(PNode pT,string& str) {
	if (pT == NULL) {
		return ;
	}
	str += ('0' + pT->data);
	preorder(pT->pLeftChild,str);
	preorder(pT->pRightChild,str);

}

int main() {
	int n;

	string ori;
	string contrast;

	PNode pT = NULL;
	PNode pT2 = NULL;
	while(cin >> n && n != 0) {
		// 输入用于参照的string ori并且 建立好搜索二叉树pT,先序遍历存储在oriRes;
		cin >> ori;
		pT = NULL;
		oriRes = "";
		for (int i = 0; i <= ori.size() - 1; i ++) {
			insert(pT,ori[i] - '0');
		}
		preorder(pT,oriRes);


		// 输入用于对比的string contrast 并且建立好搜索二叉树pT2,先序遍历存储在contrastRes;
		for (int i = 1; i <= n; i++) {
			cin >> contrast;
			pT2 = NULL;
			contrastRes = "";
			for (int j = 0; j <= contrast.size() - 1; j++ ) {
				insert(pT2,contrast[j] - '0');
			}
			preorder(pT2,contrastRes);

			// 对比
			if (oriRes == contrastRes) {
				cout << "YES" << endl;
			} else {
				cout << "NO" << endl;
			}

		}


	}



}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
构造一个最优二叉搜索树的算法被称为动态规划算法,具体思路如下: 1. 首先,将节点按照键值的大小排序,建立一棵空树。 2. 假设有n个节点,将它们编号为1到n。对于每个子树,计算其中所有节点的概率之和,以及左右子树中节点的概率之和。 3. 对于每个子树,找到其中概率和最小的节点作为根节点。 4. 以根节点作为分界点,将子树划分为左右两个子树。对于左右子树,重复步骤2和3,直到所有节点都被加入到树中。 5. 最后,构造出的树即为最优二叉搜索树。 下面是代码实现的主要思路: 1. 定义一个二维数组dp,其中dp[i][j]表示从第i个节点到第j个节点构造的最优二叉搜索树的期望搜索次数。 2. 初始化dp数组,对于只含一个节点的树,期望搜索次数即为该节点的概率。 3. 对于包含多个节点的子树,使用上述算法进行动态规划计算,更新dp数组。 4. 最后,根据dp数组构建最优二叉搜索树。 下面是伪代码: ``` function optimal_bst(p, q, n): dp = [[0] * (n + 1) for _ in range(n + 1)] # 初始化dp数组 for i in range(n): dp[i][i] = q[i] for l in range(2, n + 1): for i in range(n - l + 2): j = i + l - 1 dp[i][j] = float('inf') w = sum(p[i:j+1]) + sum(q[i:j+1]) for r in range(i, j + 1): t = dp[i][r - 1] + dp[r + 1][j] + w if t < dp[i][j]: dp[i][j] = t # 构建最优二叉搜索树 root = build_bst(dp, p, q, 0, n - 1) return root def build_bst(dp, p, q, i, j): if i > j: return None k = find_root(dp, i, j) node = TreeNode(k) node.left = build_bst(dp, p, q, i, k - 1) node.right = build_bst(dp, p, q, k + 1, j) return node def find_root(dp, i, j): min_cost = float('inf') root = -1 for k in range(i, j + 1): cost = dp[i][k - 1] + dp[k + 1][j] if cost < min_cost: min_cost = cost root = k return root ``` 其中,p和q分别为节点的概率和其它节点被搜索的概率,n为节点数。最终返回构造出的最优二叉搜索树的根节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值