求根结点到每个叶子节点的逆序列【后序遍历非递归的应用】

思想:后序遍历非递归算法,栈中存储的,从栈顶到栈底,正好是叶子节点双亲到根节点的序列,将后序遍历非递归算法中访问节点改为判断是否是叶子节点,若是输出栈中所有节点的值。

备注:如果栈不是自己用数组实现,无法通过下标遍历,遍历栈中元素,却不移除,需要另外个栈辅助。如果是自己用数组模拟栈,则可以通过控制下标,取得所求路径上的节点值,遍历栈却不移除栈中的元素;代码红色部分。

利用后序遍历的非递归实现求解代码:

package com.mytest.mymain;

import java.util.Stack;

class BTree{

public int value; //public static int value; 那么最终输出都为8个8

public BTree left;

public BTree right;

BTree(int x) { value = x; }

}

public class PreOrderwithStack {

public static void main(String[] args) {

BTree root=new BTree(1);

BTree Node2=new BTree(2);

BTree Node3=new BTree(3);

BTree Node4=new BTree(4);

BTree Node5=new BTree(5);

BTree Node6=new BTree(6);

BTree Node7=new BTree(7);

BTree Node8=new BTree(8);

root.left=Node2;

root.right=Node3;

Node2.left=Node4;

Node2.right=Node5;

Node3.left=Node6;

Node3.right=Node7;

Node4.left=Node8;

preorderfun(root);

System.out.println();

inorderfun(root);

System.out.println();

postorderfun(root);

System.out.println();

allpath(root);

}

public static void allpath(BTree root){

Stack stack =new Stack();

Stack stack2=new Stack();

BTree proot;//标记栈顶元素前一个被访问的元素

int flag;//root的左孩子未被访问;

if(root!=null){

do{

while(root!=null){//将root所有左孩子全部入栈

stack.push(root);

root=root.left;

}

//执行到此处,栈顶元素没有左孩子或者左子树已经被访问过;

proot=null;//标记栈顶元素前一个被访问的元素,或者此时为最左下边,该元素前一个被访问的元素肯定为空。

flag=1;//root的左孩子已经被访问;或者root为null

while(!stack.isEmpty() && flag==1){

root=stack.peek(); //取到栈顶元素,但是不出栈;

if(root.right==proot){

//System.out.print(root.value+" ");

if(root.left==null && root.right==null){ //是叶子节点

/*1 Iterator it=stack.iterator(); // 打印的是从根到叶子的路径;

while(it.hasNext())

System.out.print(it.next().value+" ");

System.out.println();*/

/*2 Stack stack2=(Stack) stack.clone(); //后面栈空

while(!stack.isEmpty()){

System.out.print(stack.pop().value+" ");

}

System.out.println();*/

//3.遍历栈中的元素,却不移除;

while(!stack.isEmpty()){

root=stack.pop();

System.out.print(root.value+" ");

stack2.push(root);

}

System.out.println();

while(!stack2.isEmpty()){

stack.push(stack2.pop());

}

}

root=stack.pop();

proot=root;

}else{

root=root.right;

flag=0;//root左边孩子未被访问;

}

}

}while(!stack.isEmpty());

}

}

其他思路:也可以用层次遍历的变形解决本题,修改数据结构,为每个节点添加个字段保存双亲。根节点双亲置空,在层次遍历判断的时候,判断是叶子节点,则寻找队列中的双亲节点。

java后根次序非递归输出_求根结点到每个叶子节点的逆序列【后序遍历非递归的应用】...相关推荐

  1. Java 二叉树后序遍历(递归/非递归)

    Java 二叉树后序遍历(递归/非递归) 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次. 设L.D.R分 ...

  2. 二叉树后序遍历_二叉树后序遍历非递归实现

    二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...

  3. 二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现

    二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现 提示:今天开始,系列二叉树的重磅基础知识和大厂高频面试题就要出炉了,咱们慢慢捋清楚! 文章目录 二叉树,二叉树的归先序遍历,中序遍历, ...

  4. 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

    前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...

  5. 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...

    二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...

  6. 二叉树的后序遍历(递归和非递归)

    二叉树的后序遍历 后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历.后序周游,记为左右根,简记:左右根. 步骤(非递归): ⼆叉树的后序遍历顺序是左-右-根.在这里仍然采用棧来进行辅助,具体步骤如 ...

  7. 4.二叉树的先序、中序以及后序遍历的递归写法与非递归写法(LeetCode第94、144、145题)

    一.递归法 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是"一看就会,一写就废". 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都 ...

  8. 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char DataType; #de ...

  9. 二叉树的遍历:先序 中序 后序遍历的递归与非递归实现及层序遍历

    二叉树的定义:一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树 树节点的定义如下: // 树(节点)定义 struct TreeNode {int data; // 值TreeNode* l ...

  10. 二叉树后序遍历(非递归)

    原文地址为: 二叉树后序遍历(非递归) 二叉树的递归遍历算法就不用说了:在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着 ...

最新文章

  1. DTCC:数据库安全重点在数据拷贝过程中
  2. C#----DataGridView控件60招(一) [转]
  3. js之操作JSON数据
  4. 小皮面板有php环境吗,体验phpStudy小皮面板创建LAMP/LNMP系统和建站图文
  5. 带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动
  6. python使用复合语句def创建函数对象_Python 纯函数
  7. Visual Studio 2010 Beta 2 公开下载地址
  8. Hadoop中Namenode单点故障
  9. 华为鸿蒙系统困难重重,困难重重,华为依然积极发展自主操作系统,同时布局鸿蒙和UOS...
  10. 车牌号上的省会简称;uni-app组件,vue组件通用,小程序可模仿
  11. JavaGUI版聊天室
  12. MDC300上激光雷达的接入
  13. carbon安装win7 thinkpad x1_ThinkPad X1 carbon笔记本Win7重装系统步骤详细教程。 重装系统...
  14. c语言编程出彩色告白,C语言告白代码,一闪一闪亮晶晶~
  15. 数据分析-Jupyter,Matplotlib介绍-Matplotlib绘制图形
  16. python小白逆袭大神_python小白逆天(3),Python,小白逆袭,大神,三
  17. blender导入灰度图生成地形模型
  18. SQL Server 数据库之常量
  19. java毕业设计_基于web的游泳馆管理系统的设计与实现
  20. 浅谈 Linux 内核开发之网络设备驱动[转]

热门文章

  1. 大众汽车宣布联手AWS开发汽车工业云
  2. c/c++再学习:C与Python相互调用
  3. chrome developer tool 调试技巧2
  4. 5 重启应用_5种方法教你解除 iPhone在流量环境下,无法下载超过150M的限制!
  5. 今日头条品质优化 - 图文详情页秒开实践
  6. pandas基础知识---4
  7. 非平衡电桥电阻计算_微安表内阻值对热敏电阻温度计设计的影响
  8. ai png转矢量图_Boxy SVG for Mac(矢量图编辑器)
  9. C#——WebApi 接口参数传参详解
  10. asp.net 设置敲回车触发按钮