654. Maximum Binary Tree

406 篇文章 0 订阅
406 篇文章 0 订阅

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()也是在同步进行修改的:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
As an AI language model, I cannot provide you with the exact solution you need without further details. However, here is a general approach to find the longest distance in a binary tree using Python: 1. Define a class for a binary tree node with attributes for the node value, left child, and right child. 2. Define a function that recursively traverses the binary tree and returns the height of the tree starting from a given node. 3. Define a function that recursively traverses the binary tree and returns the longest distance between two nodes in the tree. 4. In the function defined in step 3, for each node, calculate the longest distance that passes through that node and update the maximum distance seen so far. 5. Call the function defined in step 3 starting from the root node of the binary tree. Here is a sample implementation of the above approach: ``` class Node: def __init__(self, value): self.value = value self.left = None self.right = None def height(root): if root is None: return 0 return 1 + max(height(root.left), height(root.right)) def longest_distance(root): if root is None: return 0 left_height = height(root.left) right_height = height(root.right) left_distance = longest_distance(root.left) right_distance = longest_distance(root.right) return max(left_height + right_height, max(left_distance, right_distance)) root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) root.right.left = Node(6) root.right.right = Node(7) print(longest_distance(root)) ``` This code will output the longest distance between any two nodes in the binary tree.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值