1,题目要求
Given an integer array with no duplicates. A maximum tree building on this array is defined as follow:
1,The root is the maximum number in the array.
2,The left subtree is the maximum tree constructed from left part subarray divided by the maximum number.
3,The right subtree is the maximum tree constructed from right part subarray divided by the maximum number.
Construct the maximum tree by the given array and output the root node of this tree.
给定一个数组,根据数组创建一棵树,要求根节点是值最大的点,左右子树分别是根据最大的值划分后的数组所构成的。
2,题目思路
整体的思路:
定义一个向量stk,用来存储树节点(以栈的方式对其操作)。
在遍历数组时,首先为创建一个树节点cur表示当前遍历的数字;然后依次从后往前看向量stk中的树节点的值,手否小于,如果小于,则就将stk中的这个节点定义为当前cur的左孩子;需要注意的是,stk中的每一个树节点都是可能有自己的孩子的,也就是说,stk存储的都是一个个根节点,其中根节点在自己所在的子树中的值是最大的。
当在stk中遇到值比cur大的节点时,就让cur称为stk中的这个节点的右孩子。
最后,将cur加入到stk之中,用于之后的节点的插入位置判断。
3,程序源码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
vector<TreeNode*> stk; //用于保存树节点
for(int i = 0;i < nums.size();i++)
{
TreeNode* cur = new TreeNode(nums[i]); //创建一个新的树节点
while(!stk.empty() && stk.back()->val < nums[i])
{
cur->left = stk.back(); //比新节点的值小的,都是当前节点的左叶子
stk.pop_back();
}
if(!stk.empty()) //说明此时有比创建节点的值大的节点
stk.back()->right = cur;
stk.push_back(cur); //最后,将这个节点加入到stk之中
}
return stk.front(); //第一个节点一定是值最大的节点
}
};
需要注意的是,在对back()的节点进行修改是,这种修改不是孤立的,也就是说,front()也是在同步进行修改的: