当前位置: 首页 > wzjs >正文

做pc端网站流程上海手机网站建设多少钱

做pc端网站流程,上海手机网站建设多少钱,设计本家居,温州联科网站建设一、题目描述 给定一个N叉树的根节点,返回其节点值的前序遍历结果。前序遍历的定义是:先访问根节点,再依次遍历每个子节点(从左到右)。例如,对于如下N叉树: 1/ | \3 2 4 / \ 5 6前序遍历结果…

一、题目描述

给定一个N叉树的根节点,返回其节点值的前序遍历结果。前序遍历的定义是:先访问根节点,再依次遍历每个子节点(从左到右)。例如,对于如下N叉树:

    1/ | \3  2  4
/ \
5  6

前序遍历结果为:[1,3,5,6,2,4]

二、核心难点:null指针与迭代逻辑的设计

难点1:null指针的作用——标记节点处理阶段

在迭代法中,我们需要模拟递归的“回溯”过程。null指针在此充当阶段分隔符,用于区分以下两个阶段:

  1. 入栈子节点阶段:当遇到非null节点时,先将所有子节点逆序入栈,再将当前节点和null入栈,标记“子节点已入栈,等待处理当前节点值”。
  2. 收集节点值阶段:当遇到null时,说明其前一个节点的子节点已全部入栈,此时弹出该节点并收集值(类似递归中的“回溯时处理”)。

难点2:迭代逻辑的核心——栈的状态控制

  • 子节点逆序入栈:由于栈是后进先出(LIFO),将子节点按逆序入栈(如[C,B,A]入栈,弹出顺序为A,B,C),确保前序遍历的顺序(根→A→B→C)。
  • 双栈操作:通过“非null节点入栈子节点→入栈自身和null”的模式,确保在处理完所有子节点后,才会处理当前节点值,避免重复访问。

三、代码解析:迭代法的完整实现

import java.util.*;class Solution {public List<Integer> preorder(Node root) {List<Integer> res = new ArrayList<>();if (root == null) return res;Stack<Node> stack = new Stack<>();stack.push(root); // 根节点入栈while (!stack.isEmpty()) {Node node = stack.pop(); // 弹出节点if (node != null) {// 1. 逆序入栈所有子节点if (node.children != null) {for (int i = node.children.size() - 1; i >= 0; i--) {stack.push(node.children.get(i));}}// 2. 入栈当前节点和null(标记处理阶段)stack.push(node);stack.push(null);} else {// 遇到null,说明前一个节点的子节点已处理完毕,收集当前节点值Node valNode = stack.pop();res.add(valNode.val);}}return res;}
}

四、迭代流程模拟:以示例N叉树为例

初始状态

  • 栈:[1]
  • 结果:[]

第一次循环

  1. 弹出1(非null):
    • 子节点为[3,2,4],逆序入栈为4,2,3
    • 入栈1null,栈变为:[4,2,3,1,null]

第二次循环

  1. 弹出null
    • 弹出1,加入结果[1]
    • 栈变为:[4,2,3]

第三次循环

  1. 弹出3(非null):
    • 子节点为[5,6],逆序入栈为6,5
    • 入栈3null,栈变为:[4,2,6,5,3,null]

第四次循环

  1. 弹出null
    • 弹出3,加入结果[1,3]
    • 栈变为:[4,2,6,5]

第五次循环

  1. 弹出5(非null,无子节点):
    • 入栈5null,栈变为:[4,2,6,5,null]

第六次循环

  1. 弹出null
    • 弹出5,加入结果[1,3,5]
    • 栈变为:[4,2,6]

后续循环

  • 类似流程处理624,最终结果为[1,3,5,6,2,4]

五、关键知识点:前序与后序迭代法的对比

前序遍历(当前代码)

  • 核心逻辑
    非null节点→逆序入栈子节点→入栈自身和null
    确保先处理子节点,再通过null触发收集当前节点值。

后序遍历(修改版代码)

public List<Integer> postorder(Node root) {List<Integer> res = new ArrayList<>();if (root == null) return res;Stack<Node> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()) {Node node = stack.pop();if (node != null) {stack.push(node); // 先入栈当前节点stack.push(null); // 标记后序处理// 正序入栈子节点(与前序相反)if (node.children != null) {for (Node child : node.children) {stack.push(child);}}} else {Node valNode = stack.pop();res.add(valNode.val); // 后序收集}}return res;
}
  • 关键修改
    1. 子节点正序入栈(前序为逆序),确保后序遍历顺序(左→右→根)。
    2. null标记后处理当前节点,确保子节点先被处理。

六、null指针的本质:模拟递归的压栈与回溯

递归流程迭代(栈+null)模拟
调用preorder(root)stack.push(root)
递归前序遍历子节点逆序入栈子节点,压栈root和null
回溯时处理root.val遇到null,弹出root并收集值

null指针的作用相当于递归中的“回溯点”,通过栈的状态机控制,将递归的隐式调用栈转化为显式的栈操作,实现非递归算法。

七、总结:迭代法的优势与适用场景

优势

  • 空间可控:避免递归深度过大导致的栈溢出(如树高为1e5时)。
  • 灵活性:可方便修改为后序、层序等其他遍历方式(只需调整入栈顺序和标记逻辑)。

适用场景

  • 所有需要深度优先遍历(DFS)的树结构问题,尤其是N叉树(递归可能复杂)。
  • 面试中要求“非递归”解法的场景。

核心思想

通过栈模拟递归的调用栈,利用null等标记符区分节点的“预处理阶段”和“回溯处理阶段”,实现对遍历顺序的精确控制。理解这一思想后,可举一反三解决二叉树、N叉树的各种遍历问题。


文章转载自:

http://2ybYgLnB.mLfmj.cn
http://XtBJGBUC.mLfmj.cn
http://RlpQEAhX.mLfmj.cn
http://F0bbnMO0.mLfmj.cn
http://zHBIpVzW.mLfmj.cn
http://fCrun2iE.mLfmj.cn
http://3DgEfYDt.mLfmj.cn
http://hO8XIpj7.mLfmj.cn
http://qM4rbwSH.mLfmj.cn
http://tQIsFkZN.mLfmj.cn
http://pITOhYDu.mLfmj.cn
http://U1GSAqCF.mLfmj.cn
http://x04ePXYV.mLfmj.cn
http://NfOuG218.mLfmj.cn
http://WnWFG1t6.mLfmj.cn
http://Yupveuo5.mLfmj.cn
http://4j1i3LWW.mLfmj.cn
http://V4cYfsrm.mLfmj.cn
http://kCsU6TnN.mLfmj.cn
http://1HqAFwhL.mLfmj.cn
http://QWuugtUB.mLfmj.cn
http://TXSVCA0y.mLfmj.cn
http://Z56FjWMI.mLfmj.cn
http://F3Jr3iBQ.mLfmj.cn
http://GzwxiFH6.mLfmj.cn
http://DEm1CaR1.mLfmj.cn
http://You5jpz9.mLfmj.cn
http://2G6MBZDp.mLfmj.cn
http://TZ9mQHkY.mLfmj.cn
http://pCvAQnH8.mLfmj.cn
http://www.dtcms.com/wzjs/749546.html

相关文章:

  • 网站开发行业资讯专业网站建设需要多少钱
  • 北大青鸟网站建设课程源码下载器
  • 做网站有没有受骗过精致的个人网站
  • 江苏省宿迁市建设局网站公司网站怎么登录
  • 网站建设审核需要多长时间wordpress rpc 评论
  • 零基础网站建设视频淘宝网站建设方案模板下载
  • 宣武郑州阳网站建设合肥网页设计就业
  • 教学成果奖网站建设百度点击软件还有用吗
  • 盐城网站开发厂商做数据的网站有哪些
  • 宜春个人网站建设起个娱乐网站名字
  • php网站建设带数据库模板什么是新闻源网站
  • 一级a做爰片免费网站 新闻wordpress主题商店
  • 做网站外包的公司好干嘛网校 039 网站建设多少钱
  • 像那种代刷网站怎么做2023营业执照年检入口官网
  • 成都地区网站开发成本学校网站建设实施方案
  • 个人网站空间价格企业网站推广技巧有哪些
  • 河南网站推广那家好做个外贸网站设计
  • 泉州市住房和城乡建设网站无锡做装修网站
  • 如何查找网站建设时间建设厅证件查询系统
  • 做任务拍照片赚钱的网站vps做网站用什么系统
  • 东莞市企业网站制作服务机构建英文网站费用
  • 外贸一般在哪些网站做一个app软件大概需要多少钱
  • 945新开传奇网站长沙专业网站建设运营
  • 番禺电子商务网站建设自己弄网站需要多少钱
  • php网站建设设计方法网站百度收录变少
  • 网站建设经费请示网站建设推广专员岗位职责
  • 授权购买网站酒水销售网站模板
  • 郑州专业手机网站制作北京网站设计研究与开发公司
  • 美食网站策划书范文公司要做seo
  • 如何进行公司网站的建设网站配置怎么