[Swift]LeetCode1026. 节点与其祖先之间的最大差值 | Maximum Difference Between Node and Ancestor

Given the root of a binary tree, find the maximum value V for which there exists different nodes A and B where V = |A.val - B.val| and A is an ancestor of B.

(A node A is an ancestor of B if either: any child of A is equal to B, or any child of A is an ancestor of B.)

Example 1:

Input: [8,3,10,1,6,null,14,null,null,4,7,13]
Output: 7
Explanation:
We have various ancestor-node differences, some of which are given below :
|8 - 3| = 5
|3 - 7| = 4
|8 - 1| = 7
|10 - 13| = 3
Among all possible differences, the maximum value of 7 is obtained by |8 - 1| = 7.

Note:

  1. The number of nodes in the tree is between 2 and 5000.
  2. Each node will have value between 0 and 100000.


给定二叉树的根节点 root,找出存在于不同节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。

(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)

示例:

输入:[8,3,10,1,6,null,14,null,null,4,7,13]
输出:7
解释:
我们有大量的节点与其祖先的差值,其中一些如下:
|8 - 3| = 5
|3 - 7| = 4
|8 - 1| = 7
|10 - 13| = 3
在所有可能的差值中,最大值 7 由 |8 - 1| = 7 得出。

提示:

  1. 树中的节点数在 2 到 5000 之间。
  2. 每个节点的值介于 0 到 100000 之间。

Runtime: 416 ms

Memory Usage: 129.4 MB

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     public var val: Int
 5  *     public var left: TreeNode?
 6  *     public var right: TreeNode?
 7  *     public init(_ val: Int) {
 8  *         self.val = val
 9  *         self.left = nil
10  *         self.right = nil
11  *     }
12  * }
13  */
14 class Solution {
15     func maxAncestorDiff(_ root: TreeNode?) -> Int {
16         var list:[[Int]] = binaryTreePaths(root)
17         var res:Int = 0
18         for arr in list
19         {
20             res = max(res,getMaxDifference(arr))
21         }
22         return res
23     }
24
25     func getMaxDifference(_ arr:[Int]) -> Int
26     {
27         var res:Int = 0
28         for i in 0..<arr.count
29         {
30             for j in (i + 1)..<arr.count
31             {
32                 res = max(res,abs(arr[i] - arr[j]))
33             }
34         }
35         return res
36     }
37
38     //获取所有子树
39     func binaryTreePaths(_ root: TreeNode?) -> [[Int]] {
40         var list:[[Int]] = [[Int]]()
41         recuesive(root,&list,[Int]())
42         return list
43     }
44
45     func recuesive(_ root:TreeNode?,_ list:inout [[Int]],_ arr:[Int])
46     {
47         if root == nil {return}
48         var arrNew:[Int] = arr
49         var arrRoot:[Int] = [root!.val]
50         if root?.left == nil && root?.right == nil
51         {
52             arrNew = arrNew + arrRoot
53             list.append(arrNew)
54             return
55         }
56         arrRoot = arrNew + arrRoot
57         recuesive(root?.left,&list,arrRoot)
58         recuesive(root?.right,&list,arrRoot)
59     }
60 }

原文地址:https://www.cnblogs.com/strengthen/p/10704595.html

时间: 2024-11-13 09:06:12

[Swift]LeetCode1026. 节点与其祖先之间的最大差值 | Maximum Difference Between Node and Ancestor的相关文章

jQuery之防止冒泡事件,冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。

冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. 下面是html代码部分: <body> <div id="content"> 外层div元素 <span>内层span元素</span> 外层div元素 </div> <div id="msg"></div> </body> 对应的jQuery代码如下: <script type="text/

Swift编程语言学习1.5——类型别名、布尔值、元组

类型别名 类型别名(type aliases)就是给现有类型定义另一个名字.你可以使用typealias关键字来定义类型别名. 当你想要给现有类型起一个更有意义的名字时,类型别名非常有用.假设你正在处理特定长度的外部资源的数据: typealias AudioSample = UInt16 定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名: var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound 现在是 0 本例中,A

点击每个li节点,都弹出其文本值及修改

点击每个li节点,都弹出其文本值 1,获取所有的li节点 var liNodes=document.GetElementsByTagName("li"); 2,使用for循环进行遍历,得到每一个li节点 for(var i=0;i<liNodes.length;i++){ alert(i); } 3,为每一个li节点添加onclick响应函数 liNodes[i].onclick=function(){ } 4,在响应函数中获取当前节点的文本值 this 为正在响应事件的那个节点

C#用反射实现两个类的对象之间相同属性的值的复制

在进行实体转换操作的时候如果需要在对两个实体之间两个属性字段差不多相同的类要进行一个互相的转换,我们要把a对象的所有字段的值都复制给b对象,我们只能用b.属性=a.属性来写,如果属性字段太多的话,就要写很多行复制语句,麻烦还容易漏掉一些,这个时候可以利用c#的反射来实现复制.我们可以写这样一个利用泛型的映射函数. 1.适用于创建实体的时候从一个实体作为数据源赋值 /// <summary> /// 反射实现两个类的对象之间相同属性的值的复制 /// 适用于初始化新实体 /// </sum

Labview中引用,属性节点,局部变量之间的区别

在Labview中我们经常会碰到这样几个概念,那就是控件的引用,属性节点以及局部变量,他们之间到底有哪些区别呢? 首先谈引用,在Labview中长称为引用句柄,在Windows编程中,引用句柄指的是指向指针的指针,换句话说,引用句柄保存的是其他一些数据类型的地址,例如窗口句柄.在Labview中,控件的引用句柄指的也是指向特定数据类型的指针,在Labview中,控件的引用句柄是长度为四个字节,引用句柄不但能够表示控件的类型,还与空间一一对应,这是通过句柄的编号来实现的,引用句柄自身未代表任何空间

用Swift完成不同View Controller之间的切换

之前用objective-c开发时,页面之间的切换很容易.其实用swift没有很大的变化,如果你是用storyboard完成的界面,基本上是同样的方式,只不过在代码部分写成swift风格的就行了. 今天在实验开发一个简单的小程序时,却遇到了一些bug,后来还是求助stackoverflow上的大神解决了问题,在此做下记录. 我的程序结构是这样的,在一个页面A中有个按钮,然后点击按钮以后,切换到另一个页面B.A和B都在同一个storyboard中. 这里先说下通用的方法: 手动用代码建好的view

二叉树(12)----查找两个节点最低祖先节点(或最近公共父节点等),递归和非递归

1.二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.查找二叉树中两个节点的最低祖先节点(或最近公共父节点等) 最低祖

第4章第1节练习题8 打印指定节点的祖先节点

问题描述 在二叉树中查找值为x的节点,试编写算法打印值为x的节点的所有祖先节点,假设值为x的节点不多于一个 算法思想 因为仅仅只是打印祖先节点,可以考虑使用非递归后序遍历的方式来实现. 在非递归后序遍历的方式中,保留在栈中的所有元素(除栈顶外)必然是栈顶的祖先节点,因此只要找到x节点,然后将栈中所有节点出栈便可. 算法描述 void AncestorX(BiTNode* T,ElemType x){ SqStack S; InitStack(&S); BiTNode* p=T; BiTNode*

Swift计算两个经纬度之间的球面面积

func distanceBetween(#lat1: Float, lng1: Float, lat2: Float, lng2: Float) -> Float{ var jl_jd: Float = 102834.74258026089786013677476285 var jl_wd: Float = 111712.69150641055729984301412873 var b: Float = abs((lng1 - lng2) * jl_jd) var a: Float = abs