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

来源:互联网 发布:apache tomcat怎么安装 编辑:程序博客网 时间:2024/06/05 15:34

子树的意思是包含了一个节点,就得包含这个节点下的所有节点,一棵大小为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 0