zoukankan      html  css  js  c++  java
  • N叉树基础(含四种遍历,图文详解)

    定义

    二叉树中每个结点有一个数据项,最多有两个子节点,如果允许树的每个节点可以有两个以上的子节点,那么这个树就称为n阶的多叉树,或者称为n叉树。

    性质

    每个节点有m个子节点和m-1个键值。
    每个节点中的键值按升序排列。
    前i个子节点中的键值都小于第i个键值。
    后m-1个子节点中的键值都大于第i个键值。

    N叉树的遍历

    树的遍历

    一棵二叉树可以按照前序、中序、后序或者层序来进行遍历。在这些遍历方法中,前序遍历、后序遍历和层序遍历同样可以运用到N叉树中。

    回顾 - 二叉树的遍历
    前序遍历 - 首先访问根节点,然后遍历左子树,最后遍历右子树;
    中序遍历 - 首先遍历左子树,然后访问根节点,最后遍历右子树;
    后序遍历 - 首先遍历左子树,然后遍历右子树,最后访问根节点;
    层序遍历 - 按照从左到右的顺序,逐层遍历各个节点。
    

    请注意,N叉树的中序遍历没有标准定义,中序遍历只有在二叉树中有明确的定义。尽管我们可以通过几种不同的方法来定义N叉树的中序遍历,但是这些描述都不是特别贴切,并且在实践中也不常用到,所以我们暂且跳过N叉树中序遍历的部分。

    把上述关于二叉树遍历转换为N叉树遍历,我们只需把如下表述:

    遍历左子树... 遍历右子树... 
    

    变为:

    对于每个子节点:
          通过递归地调用遍历函数来遍历以该子节点为根的子树
    

    我们假设for循环将会按照各个节点在数据结构中的顺序进行遍历:通常按照从左到右的顺序,如下所示。

    N叉树遍历示例

    我们用如图所示的三叉树来举例说明:

    在这里插入图片描述

    1.前序遍历

    在N叉树中,前序遍历指先访问根节点,然后逐个遍历以其子节点为根的子树。
    例如,上述三叉树的前序遍历是: A->B->C->E->F->D->G.
    对应题目解析N叉树的前序遍历

    2.后序遍历

    在N叉树中,后序遍历指前先逐个遍历以根节点的子节点为根的子树,最后访问根节点。
    例如,上述三叉树的后序遍历是: B->E->F->C->G->D->A.
    对应题目解析:N叉树的后续遍历。

    3.层序遍历

    N叉树的层序遍历与二叉树的一致。通常,当我们在树中进行广度优先搜索时,我们将按层序的顺序进行遍历。
    例如,上述三叉树的层序遍历是: A->B->C->D->E->F->G.
    对应题目解析:https://blog.csdn.net/weixin_43314519/article/details/106981653

    N叉树的经典递归解法

    经典递归法

    1. "自顶向下"的解决方案

       "自顶向下"意味着在每个递归层次上,我们首先访问节点以获得一些值,
       然后在调用递归函数时,将这些值传给其子节点。
      

    一个典型的 “自顶向下” 函数 top_down(root, params) 的工作原理如下:

    1. 对于 null 节点返回一个特定值
    2. 如果有需要,对当前答案 answer 进行更新                         // answer <-- params
    3. for each child node root.children[k]:
    4.    ans[k] = top_down(root.children[k], new_params[k])  // new_params <-- root.val, params
    5. 如果有需要,返回答案 answer                                 // answer <-- all ans[k]
    
    1. "自底向上"的解决方案

       "自底向上" 意味着在每个递归层次上,我们首先为每个子节点递归地调用函数,
       然后根据返回值和根节点本身的值给出相应结果。
      

    一个典型的 “自底向上” 函数 bottom_up(root)的工作原理如下:

    1.对于 null 节点返回一个特定值
    2.for each child node root.children[k]:
    3.    ans[k] = bottom_up(root.children[k]) // 为每个子节点递归地调用函数
    4. 返回答案 answer                          // answer <- root.val, all ans
    

    对应题目解析: N叉树的最大深度

  • 相关阅读:
    最近写代码的风格,请帮忙分析下优缺点
    jQuery的回调管理机制(三)
    jQuery的回调管理机制(二)
    jQuery的回调管理机制
    iOS组件化
    iOS内存泄漏检测及分析
    iOS 路由
    iOS https抓包工作记录
    第二章 算法入门
    第一章 算法在计算中的作用
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13308019.html
Copyright © 2011-2022 走看看