uiautomation遍历windows所有窗口_【阿里高频题】动画讲解二叉树深度优先遍历

在 【腾讯面试热身题】二叉树层次遍历(动画展示)中,我们学习了二叉树的层次遍历,这次我们要学习的是二叉树的深度优先遍历。这是两种非常经典的二叉树遍历方式,可以说,属于面试大厂时闭着眼都要能写出来的方式。

1 例题描述

给当一个二叉树和一个数S,验证是否存在一个从root到leaf的路径,路径上元素的和恰好等于S。

例子1

比如S=10,下图中就存在 1-3-6这条路径。

f1b1569fbbaf8c85d86bf4229d6b6394.png

例子2

再比如S=23,下图中是存在 12-1-10这条路径的。

c32442ca5979d2cf522baa77222ff518.png

2 问题分析

因为我们要寻找的是从root到leaf的路径,显然可以使用深度优先搜索(DFS)来完成任务。

利用DFS来递归访问一个二叉树时,我们是从根节点开始,然后在每一步中,分别递归地访问当前节点的左右子节点。

具体到今天这道题,我们可以这么做(后面有动画展示):

  • 从root节点开始进行DFS遍历
  • 如果当前节点不是leaf节点,做两件事:
    • 更新S值,将S值减去当前节点的值,作为新的S值,即S = S - node.value
    • 递归访问该节点的左右子节点,同时传入更新后的S值
  • 在每一步中,如果当前节点是leaf节点,并且节点的值等于传过来的S值,此时,我们就找到一条满足条件的路径!返回true即可。
  • 如果当前节点是leaf节点,但是节点的值不等于传入的S,则说明该从root到该leaf的路径不符合要求,返回false即可。

例子2为例,整个算法过程如下所示:

3 代码实现

class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right


def has_path(root, sum):
if root is None:
return False

# 当前节点是leaf节点,
# 并且它的节点值等于传过来的S值,
# 我们就找到了一个路径
if root.val == sum and root.left is None and root.right is None:
return True

# 递归遍历左右子树
# 当任何一棵子树返回true时
# 就返回true给上级调用
return has_path(root.left, sum - root.val) or has_path(root.right, sum - root.val)

4 思考题

如何找到所有满足条件的路径呢?且听下回分解。

往期精彩回顾

【头条面试-40K】反转链表加强版

【字节高频热身题】双指针实现数据挪移

滑动窗口算法最简单的教程(4)

【面霸之路】双指针和滑动窗口结合

【腾讯面试热身题】二叉树层次遍历(动画展示)

根据UIAutomation封装了很多自定义方法 现在只需要实例化之后 直接调用方法即可完成。比如单击某个按钮,现在只需要直接调用ClickElement,非常实用。 ClickElement 单击指定的自动化元素 DisselectAllDataGridRow 不选中所有行 DisselectDataGridRow 不选中特定的某一行 FocusWindow 获取窗口焦点 GetAllElement 获取指定父自动化元素下的所有激活的控件 GetAllElementDetails 获取指定自动化元素下的详细信息包括AutomationID,ControlType以及Name GetAllMenus 获取所有菜单项 GetAllSubMenus 获取某个菜单下的所有子菜单项 GetColumnsFromGridLine 获取指定行的所有列 GetColumnValuesFromGridLine 获取行的每一列数据 GetControlType(AutomationElement) 获取制动自动化元素的控件类型 GetControlType(TypeOfControl) 获取UIAutomation的控件类型 GetDocumentText 获取document控件的值 GetElementByID 获取父自动化元素下指定元素控件ID的引用 GetElementByName 获取父自动化元素下的指定子元素的引用 GetElementsByControlType 获取父自动化元素下的特定类型的所有自动化元素 GetGridLinesFromDataGrid 获取网格控件的全部行元素的引用 GetHeaderFromDataGrid 获取指定网格控件的标栏引用 GetMenuBar 获取菜单栏控件 GetMenuByName 通过特定的名称去获取菜单UI自动化元素 GetName 获取指定自动化元素的名称 GetSubMenuByName 获取主菜单下的指定子菜单项的引用 GetValue 获取指定自动化元素的值 GetWindowByName(String) 获取desktop下的指定窗口名称的子UI自动化元素 GetWindowByName(String, AutomationElement) 获取特定父UI自动化元素下的制定窗口名称的子UI自动化元素 GetWindowList() 获取当前桌面根下所有的UI自动化元素下 GetWindowList(AutomationElement) 获取特定父UI自动化元素下的所有窗口的名称 RefindMainApplication 重新获取desktop下的指定窗口的自动化元素引用 SelectAllDataGridRow 选中所有行 SelectDataGridRow(AutomationElement) 选中特定的某一行 SelectDataGridRow(AutomationElement, Boolean) 将特定的DateGridRow加入选中项中 SelectValueInComboBox 从下拉框中选中指定值的项 SelectValueInListBox 从列表中选中指定值的项 SetValue 给予指定自动化元素赋值 以上的方法还不是很完善 正在完善中。如果有什么意见和建议,请发送邮件获取 chenxu7601257@qq.com 如果你看了这个帮助文件之后觉得有用的,请发邮件获取,我将把dll文件给你。谢谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值