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

政务类网站百度推广投诉电话

政务类网站,百度推广投诉电话,西安微网站建设,wordpress 文件上传功能迭代法实现二叉树的后续遍历 1、递归版本 public static void dfs(TreeNode root){if(rootnull){return;}if(root.left!null)dfs(root.left);if(root.right!null)dfs(root.right);System.out.println(root.val); }从递归版本可以看出我们第一步需要遍历完所有的左节点 这里我…

迭代法实现二叉树的后续遍历

1、递归版本

public static void dfs(TreeNode root){if(root==null){return;}if(root.left!=null)dfs(root.left);if(root.right!=null)dfs(root.right);System.out.println(root.val);
}

从递归版本可以看出我们第一步需要遍历完所有的左节点
这里我们使用一个栈来存储树的节点,模拟递归的先进后出。

Stack<TreeNode> stack = new Stack<>();
if(root!=null){return;
}
stack.push(root);
while(!stack.isEmpty()){//遍历所有的左节点直到左节点为nullwhile(root!=null&&root.left!=null){root = root.left;stack.push(root);}//再看递归的第二步就是访问右子树。root = stack.pop();  //取出栈顶元素,准备遍历它的右子树if(root.right==null){ //说明没有右子树,就可以直接访问root节点了System.out.println(root.val);}else{//然后就又会回到上面那个while循环遍历这个右子树所有的左节点root = root.right; stack.push(root);}
}

上面就是大致的逻辑,但还有两个重要的问题没有解决。
问题1:关于左子树的重复访问。
1、当栈顶节点为3时,root = stack.pop() 。此时root指向3节点

2、然后进入while循环,又会将6号节点再次访问一遍。因为1号节点已经访问过6了。

红色箭头表示对于root节点,访问它左子树的所有左节点。
绿色箭头表示3节点,访问它左子树的所有左节点。可以看出6节点是重复访问了的。
在这里插入图片描述
解决方法:对于从栈中取出的节点,如果没有右子树就设置为null。

Stack<TreeNode> stack = new Stack<>();
if(root!=null){return;
}
stack.push(root);
while(!stack.isEmpty()){while(root!=null&&root.left!=null){root = root.left;stack.push(root);}root = stack.pop();  if(root.right==null){ root = null;  //防止重复访问左节点System.out.println(root.val);}else{root = root.right; stack.push(root);}
}

问题2:
栈顶取出的节点有右子树的情况下,造成该节点没有被访问。

while(!stack.isEmpty()){while(root!=null&&root.left!=null){root = root.left;stack.push(root);}root = stack.pop();  if(root.right==null){ root = null;System.out.println(root.val);}else{  //含有右子树时。这时的root并没有被访问,而root也被root = root.right;覆盖掉了。所以就会造成当前节点root缺失访问。root = root.right; stack.push(root);}
}

解决方案:在root被root = root.right覆盖之前再将root存回栈中。
我们将root取出来的目的就是访问它的右子树。

while(!stack.isEmpty()){while(root!=null&&root.left!=null){root = root.left;stack.push(root);}root = stack.pop();  if(root.right==null){ root = null;System.out.println(root.val);}else{  stack.push(root); //保存当前节点root = root.right; stack.push(root); //保存当前节点的右子节点}
}

虽然解决了在栈顶取出的节点有右子树的情况下造成该节点没有被访问的问题,但又引出了一个新的问题,重复访问右子节点。

为了解决缺失访问时将2节点存入了栈两次。

1、一次是遍历所有左子树的所有左子节点加入的。(这次的加入目的是用来遍历该节点右子树的)

2、一次是为了解决缺失访问又将2节点存入栈中。(这次的目的是为了在遍历完右子树后再访问2节点用的。因为是后序遍历)
在这里插入图片描述
通过代码可以看出,如果我们不加以限制,那么这个2节点就会第三次,第四次…入z栈造成重复访问。

我们的需求是对于有右子树的节点只访问两次。所以我们可以引入一个标记。
TreeNode pre = null
pre变量的作用就是标识该节点的右子树是否已经遍历过了,如果遍历过了。我们就不将其再次入栈了。
当pre==root.right说明右子树已经访问过了。

最终版本

//这个pre防止重复遍历右子树
TreeNode pre = null;while(!stack.isEmpty()){while (root!=null&&root.left != null) {root = root.left;stack.push(root);}root = stack.pop();//pre==root.rightif(root.right==null||pre==root.right){pre = root;System.out.println(root.val);//这个root设置为null防止重复遍历左子树root = null;}else{stack.push(root);root = root.right;stack.push(root);}}

如果节点2的右子树等于pre就说明这个右子树已经访问过了。2节点的左右子树都访问完就可以按照同样操作继续处理1节点了。
在这里插入图片描述
从图中可以看出pre指针是从下往上一步一步传递上去的。

http://www.zhongyajixie.com/news/62465.html

相关文章:

  • 如何在国际上做网站seo信息网
  • 有什么网站可以做java算法培训班报名
  • 最牛的网站建设广告推广平台网站有哪些
  • 哪家公司网站做的好短视频矩阵seo系统源码
  • 网站导航怎么做的网络推广营销网站建设专家
  • 网站制作top关键词搜索点击软件
  • 国贸行业的网站建设苏州疫情最新消息
  • 义乌做网站哪个公司好上海百度seo牛巨微
  • 网站建设服务合同纠纷百度搜索网
  • 前程无忧深圳招聘网站网页版百度
  • 网站怎么做营销策划搜狗登录入口
  • 经营一个网站要怎么做免费网站建站2773
  • 外国优秀设计网站seo顾问张智伟
  • 做直播小视频在线观看网站快速提高排名
  • vs2013 网站建设福州seo快速排名软件
  • 做刷单哪个网站找小白适合seo软件
  • dedecms仿站百度网盘资源搜索引擎
  • 目前做的比较好的情趣用品网站百度广告太多
  • 网站怎样赚钱企业网站开发多少钱
  • 公司管理类培训网站推广和网站优化
  • 汕头有几个区几个县seo软件服务
  • 网站上怎么做弹幕效果图怎么做个人网页
  • 关于企业网站建设的必要性深圳网站建设推广优化公司
  • 科技魏seoul是什么意思
  • 网站做外链软件淘宝关键词排名怎么查询
  • 网站建设定制开发服务seo课程培训机构
  • jquery网站开发实例站长工具seo优化
  • 网站网站建设平台杭州优化关键词
  • wordpress phpstorm首页关键词优化价格
  • 简单网页制作成品代码百度移动端优化