我们学习树的时候,一些地方用到了递归,但是可能没意识到这里面都是分治的思想

=============================================================================

结合这几个例子,体会一下树形结构

树本来就是一个天然的递归结构,每一个递归都对应着一个递归树

就二叉树而言,每一个二叉树对应着一个左子树,一个右子树

都不用我们思考怎么划分子问题,现在两个子问题就已经划分好了

那么每一棵树对应三部分:当前结点,左子树,右子树

那么我们处理原问题,只需要对应处理这三部分就可以了

递归实现的出口是什么,出口就是叶子结点的左右子树,也就是空树,出口就是空树return

=============================================================================

# -*- coding: utf-8 -*-# 构造一棵树
# 首先需要定义结点
class BinTNode:def __init__(self,data=None,left =None,right =None):self.data =dataself.left =leftself.right =right
# =============================================================================
# 结合这几个例子,体会一下树形结构
# 树本来就是一个天然的递归结构,每一个递归都对应着一个递归树
# 就二叉树而言,每一个二叉树对应着一个左子树,一个右子树
# 都不用我们思考怎么划分子问题,现在两个子问题就已经划分好了
# 那么每一棵树对应三部分:当前结点,左子树,右子树
# 那么我们处理原问题,只需要对应处理这三部分就可以了
# 递归实现的出口是什么,出口就是叶子结点的左右子树,也就是空树,出口就是空树return
# =============================================================================# 我们统计树的结点,当前结点1个+左子树的结点和+右子树的结点和
def count_TreeNodes(root):if not root:return 0else:return 1 + count_TreeNodes(root.left) + count_TreeNodes(root.right)# 我们统计树的权值和,当前结点权值+左子树的权值和+右子树的权值和
def sum_TreeValues(root):if not root:return 0else:return root.data + sum_TreeValues(root.left) + sum_TreeValues(root.right)  # 同样的道理,获取树的高度
def height_Tree(root):if not root:return 0else:return 1 + max(height_Tree(root.left),height_Tree(root.right))
# 合并子树
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def mergeTrees(self, t1, t2):""":type t1: TreeNode:type t2: TreeNode:rtype: TreeNode"""        if t1 and t2:t1.val += t2.valt1.left = self.mergeTrees(t1.left, t2.left)t1.right =  self.mergeTrees(t1.right, t2.right)            else:t1 = t1 or t2            return t1

我们讨论树的遍历,对于一棵树:

先根遍历:遍历当前结点–>遍历左子树–>遍历右子树

中根遍历:遍历左子树–>遍历当前结点–>遍历右子树

后跟遍历:遍历左子树–>遍历右子树–>遍历当前结点

这是从整个问题来考虑

还有一个思考为什么这3种遍历成了深度优先搜索了?

只要是递归必然是深度优先,因为只要是递归就必须一直探到底部,然后逐步返回

整个看起来,先处理左边,再处理右边,很像宽度优先是吧,其实所有的递归都是深度优先

处理时应该从整体分解子问题的角度来分析

# 我们讨论树的遍历,对于一棵树:
# 先根遍历:遍历当前结点-->遍历左子树-->遍历右子树
# 中根遍历:遍历左子树-->遍历当前结点-->遍历右子树
# 后跟遍历:遍历左子树-->遍历右子树-->遍历当前结点
# 这是从整个问题来考虑
# 还有一个思考为什么这3种遍历成了深度优先搜索了?
# 只要是递归必然是深度优先,因为只要是递归就必须一直探到底部,然后逐步返回
# 整个看起来,先处理左边,再处理右边,很像宽度优先是吧,其实所有的递归都是深度优先
# 处理时应该从整体分解子问题的角度来分析
def preorder(root):if not root:returnelse:print(root.data,end=' ')preorder(root.left)preorder(root.right)def inorder(root):if not root:returnelse:inorder(root.left)print(root.data,end=' ')inorder(root.right)def postorder(root):if not root:returnelse:postorder(root.left)postorder(root.right)print(root.data,end=' ')

运行结果:

root = BinTNode(1,BinTNode(2,BinTNode(4),BinTNode(5)),BinTNode(3,BinTNode(6),BinTNode(7)))
print(count_TreeNodes(root))
print(sum_TreeValues(root))
print('preorder:',end='')
preorder(root)
print(end='\n')
print('inorder:',end='')
inorder(root)
print(end='\n')
print('postorder:',end='')
postorder(root)
print(end='\n')
print('Height:',end='')
print(height_Tree(root))
print(end='\n')runfile('D:/share/test/TreeRecursion.py', wdir='D:/share/test')
7
28
preorder:1 2 4 5 3 6 7
inorder:4 2 5 1 6 3 7
postorder:4 5 2 6 7 3 1
Height:3

树形结构:二叉树,分治,合并子树,递归相关推荐

  1. 数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)

    目录 4.1.树 4.2.二叉树 4.2.1.概述 4.2.3.存储结构 4.2.3.遍历 1.逻辑简介 2.代码示例 4.1.树 树,由n(n≥0)个有限节点和边组成一个具有层次关系的数据结构.树需 ...

  2. 树形结构----二叉树

    1. 二叉树的定义:二叉树( Binary Tree )是n( n≥0 )个结点的有限集合,该集合或者空集( 称为空二叉树 ),或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树 ...

  3. 寻找数组变化:树形结构,分治模型

    寻找数组变化 给定数组arr = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1],返回第一个1的下标 很明显需要借助于二分查找,二分查找轻微变形就可以实现 第一种思 ...

  4. 树形结构来了(了解)

    树形结构 大自然中的树: 一. 树的概念及特点 树的概念: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合: 树的特点: 有一个特殊的结点,该结点称为根结点, ...

  5. java构建树形结构

    目录 前言 实现树形结构 一.树节点数据类(反回参数类) 二.给树形结构添加数据 三.测试类 四.测试结果 前言 在我们实际开发中会接触到树形结构,根节点子节点, 然后添加数据构成了我们的树形结构, ...

  6. 03【若依框架解读】Tree树形结构的控制(菜单,部门)

    背景 若依管理框架中包含了不少菜单树和权限树的控制,主要实现的方式是递归,比较容易阅读和理解.构建属性结构本身是开发中非常常见的场景.掌握后非常容易在工作中使用. 属性结构控制 后端返回列表,前端控制 ...

  7. 数据结构学习——树形结构之递归遍历二叉树

    目录 一. 什么是二叉树 二. 二叉树分类 2.1.完全二叉树 2.2.满二叉树 2.3.扩充二叉树 2.4.平衡二叉树 三. 二叉树的应用场景 四. 遍历方式 五. 为什么要研究遍历 六. 前序遍历 ...

  8. java 树结构递归设计,java实现递归树形结构

    数据结构递归树,数据结构递归算法,数据结构递归,数据结构递归运算,考研数据结构考递归,数据结构递归回溯,js递归树形数据结构,数据结构分治,递归变非递归用什么数据结构...... 通过函数递归调用来实 ...

  9. 树形结构 —— 树与二叉树

    [概述] 树是一种非线性的.递归定义的有序数据结构,能很好地描述有分支和层次特性的数据集合. 二叉树是树的一种形态,是 n 个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的 ...

最新文章

  1. contourArea函数
  2. RAC OEM 打开无法显示CPU情况 的解决过程
  3. 二叉树的最小深度Python解法
  4. 【工业级串口服务器E810-DTU】RS485/RS232转以太网,双向透明传输
  5. mysql 进入数据库名_操作mysql数据库的一些命名
  6. 数据类型以及数据类型的转换---防止忘记
  7. Eclipse中直接执行sql语句(图文说明)
  8. 最全电缆直径和电缆流过电流计算以及对照表
  9. Pycharm中配置.ui转.py文件;.qrc文件转.py文件和Qtcreator
  10. 批处理批量卸载微软补丁
  11. 安装win7系统时,硬盘模式为IDE模式时安装成功,硬盘模式为AHCI模式时重启蓝屏或一直启动的问题,以及IDE模式与AHCI模式的区别!
  12. 如何做好客户需求分析
  13. 清华梦的粉碎—写给清华大学的退学申请 /王垠
  14. reaxff反应力场计算
  15. linux添加jetdirect协议,Padavan 路由器固件 不能驱动 hp1005、hp1020之类打印机 foo2zjs ZjStream协议的linux打印机驱动程序...
  16. Spark 基础知识
  17. 分享一个 C# Winfrom 下的 OutlookBar 控件的使用
  18. 学linux作用,linux有必要学吗?学linux有什么作用,学linux能干什么
  19. 老调重弹:JDBC系列之驱动加载原理全面解析)
  20. 树莓派 3的新手指南

热门文章

  1. c语言 库 键盘,python 函数 map 、lambda
  2. java员工信息管理_基于jsp的员工信息管理-JavaEE实现员工信息管理 - java项目源码...
  3. mave工程中的一个类调用另一个聚合工程的一个类_信息系统管理工程师备考分享(材料重点精炼)——第一章信息化和信息系统(4)...
  4. 为什么可积不一定可导_为什么一定要办理焊工证?不办会怎么样?
  5. 星星评价控件android开发_android自定义星级评分控件,可实现只显示实心星星
  6. mysql创建账号并赋予权限
  7. 【Tomcat】解决GET方式传递的参数(URL中的参数)乱码问题
  8. Refused to display http localhost8080 xxx‘in a frame because it set ‘X-Frame-Options‘ to ‘DENY‘
  9. spring ResponseEntity
  10. idea编译的文件怎么用cmd打开_JAVA学习册|基础语法|cmd输出HelloWorld