二叉树的子树和子结构的几个问题

子树的意思是包含了一个节点,就得包含这个节点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个节点为根的子树。

子结构的意思是包含了一个节点,可以只取左子树或者右子树,或者都不取。


1.求一棵二叉树的最大BST子树

struct Result {
	int size, min, max;
	TreeNode* maxBST;
	Result(int min, int max, TreeNode* maxBST, int size) : min(min), max(max), maxBST(maxBST), size(size) {}
};
Result maxBST(TreeNode* root) {
	if (!root) return Result(INT_MAX, INT_MIN, nullptr, 0);
	auto l = maxBST(root->left);
	auto r = maxBST(root->right);
	if (l.maxBST == root->left && (!root->left || l.max < root->val) && r.maxBST == root->right && (!root->right || r.min > root->val))
		return Result(!root->left ? root->val : l.min, !root->right ? root->val : r.max, root, l.size + r.size + 1);
	return l.size > r.size ? Result(l.min, r.max, l.maxBST, l.size) : Result(l.min, r.max, r.maxBST, r.size);
}
TreeNode* maxBSTSubTree(TreeNode* root) {
	return maxBST(root).maxBST;
}

2求一个树的最大BST子结构

int maxBSTSubStructrue(TreeNode* root, int lo, int hi) {
	if (!root || root->val < lo || root->val > hi) return 0;
	return maxBSTSubStructrue(root->left, lo, root->val) + maxBSTSubStructrue(root->right, root->val, hi) + 1;
}
void dfs(TreeNode* root, int &maxLen) {
	if (root == nullptr) return;
	maxLen = max(maxLen, maxBSTSubStructrue(root, INT_MIN, INT_MAX));
	dfs(root->left, maxLen);
	dfs(root->right, maxLen);
}
int maxBSTSubStructrue(TreeNode* root) {
	int maxLen = 0;
	dfs(root, maxLen);
	return maxLen;
}

3 问一棵树B是否是另一棵树A的子树

1)如果节点值不允许重复,则可以先遍历A找B的根结点的值,然后遍历B,判断两棵树是否完全相同 O(M + N)

2) 如果节点值可以重复,则对于A中每个和B根节点值相同的结点,都要check一次,最坏O(M *N)


4一棵树是否是另一棵树的子结构

情况和4一样,只是check的逻辑稍有区别,子树是说,根节点、左右子树都必须一样;子结构的情况,子结构的某个地方为空,目标树对应的地方可以有东西


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值