C++ 最大二叉树 II
假设我们有一个最大二叉树的根节点:最大二叉树是一棵树,其中每个节点的值都大于其子树中的任何其他值。假设我们有一个名为 construct() 的方法。它可以从列表 A 构造一个根节点。construct() 方法如下:
如果列表 A 为空,则返回 null。
否则,令 A[i] 为列表 A 中的最大元素。然后创建一个值为 A[i] 的根节点。
根节点的左子节点将是 construct([A[0], A[1], ..., A[i-1]])
根节点的右子节点将是 construct([A[i+1], A[i+2], ..., A[n - 1]]) [n 是 A 的长度]
返回根节点。
请注意,我们没有直接得到 A,只有根节点 root = construct(A)。现在假设 B 是 A 的副本,其中添加了值 val。保证 B 的值唯一。我们必须构造(B)。如果值为 5,输入树如下:
输出树如下:
为了解决这个问题,我们将遵循以下步骤:
定义一个递归方法 solve()。它接收 root 和 val 作为参数。
如果树为空,则创建一个值为 val 的新节点,并返回该节点。
如果 root 的值 < val,则
temp := 创建一个值为 val 的新节点
temp 的左子节点 := root
返回 temp
root 的右子节点 := solve(root 的右子节点, val)
返回 root
让我们看看下面的实现来更好地理解:
示例
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; }else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; }else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } void tree_level_trav(TreeNode*root){ if (root == NULL) return; cout << "["; queue<TreeNode *> q; TreeNode *curr; q.push(root); q.push(NULL); while (q.size() > 1) { curr = q.front(); q.pop(); if (curr == NULL){ q.push(NULL); } else { if(curr->left) q.push(curr->left); if(curr->right) q.push(curr->right); if(curr == NULL || curr->val == 0){ cout << "null" << ", "; }else{ cout << curr->val << ", "; } } } cout << "]"<<endl; } class Solution { public: TreeNode* insertIntoMaxTree(TreeNode* root, int val) { if(!root)return new TreeNode(val); if(root->val < val){ TreeNode* temp = new TreeNode(val); temp->left = root; return temp; } root->right = insertIntoMaxTree(root->right, val); return root; } }; main(){ vector<int> v = {4,1,3,NULL,NULL,2}; TreeNode *root = make_tree(v); Solution ob; tree_level_trav(ob.insertIntoMaxTree(root, 5)); }
输入
[4,1,3,null,null,2] 5
输出
[5, 4, 1, 3, null, null, 2, ]
广告