二叉树的遍历

对于二叉树来讲最主要、最基本的运算是遍历。

遍历二叉树 是指以一定的次序访问二叉树中的每个结点。所谓 访问结点 是指对结点进行各种操作的简称。例如,查询结点数据域的内容,或输出它的值,或找出结点位置,或是执行对结点的其他操作。遍历二叉树的过程实质是把二叉树的结点进行线性排列的过程。假设遍历二叉树时访问结点的操作就是输出结点数据域的值,那么遍历的结果得到一个线性序列。

从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

 (1)访问结点本身(N),

 (2)遍历该结点的左子树(L),

 (3)遍历该结点的右子树(R)。

以上三种操作有六种执行次序:

 NLR、LNR、LRN、NRL、RNL、RLN。

注意:

前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。

  由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

  

前序

非递归

    public void preordernorec(TreeNode root){
        //System.out.println("先序遍历(非递归):");
        //用数组模拟栈,假设有节点个数不超过32个
        TreeNode[] stack = new TreeNode[32];
        for(int i =0;i<32;i++){
            stack[i] = null;
        }
        int index =0;
        TreeNode pnode = root;
        while(pnode!=null||index>0){
            while(pnode!=null){
                System.out.print(pnode.getKey()+",");
                stack[index++] = pnode;
                pnode = pnode.getLeftchlid();
            }
            pnode = stack[--index];
            pnode = pnode.getRightchild();
        }
        //System.out.println("");
    }

递归

public void preorder(TreeNode root){

        if(root!=null){
            System.out.print(root.getKey()+",");
            preorder(root.getLeftchlid());
            preorder(root.getRightchild());
        }
    }

中序

非递归

    public void inordernorec(TreeNode root){
        TreeNode[] stack = new TreeNode[32];
        int index=0;
        for(int i =0;i<32;i++){
            stack[i] = null;
        }
        TreeNode pnode = root;
        while(pnode!=null||index>0){
            while(pnode!=null){
                stack[index++] = pnode;
                pnode = pnode.getLeftchlid();
            }
            pnode = stack[--index];
            System.out.print(pnode.getKey()+",");
            pnode = pnode.getRightchild();
        }

        //System.out.println("");
    }

递归

public void inorder(TreeNode root){

        if(root!=null){

            inorder(root.getLeftchlid());
            System.out.print(root.getKey()+",");
            inorder(root.getRightchild());
        }
    }

后序遍历

非递归

public void postordernorec(TreeNode root){
    TreeNode[] stack = new TreeNode[32];
    int index=0;
    for(int i =0;i<32;i++){
        stack[i] = null;
    }
    TreeNode pnode = root;
    TreeNode LastVisit = null;
    while(pnode!=null||index>0){
        while(pnode!=null){
            stack[index++] = pnode;
            pnode = pnode.getLeftchlid();
        }
        pnode=stack[index-1];
        if(pnode.getRightchild()==null||pnode.getRightchild()==LastVisit){
            System.out.print(pnode.getKey()+",");
            LastVisit = pnode;
            index--;
            pnode = null;
        }
        else
        {
            pnode = pnode.getRightchild();
        }
    }
}

递归

public void postorder(TreeNode root){
    if(root!=null){
        postorder(root.getLeftchlid());
        postorder(root.getRightchild());
        System.out.print(root.getKey()+",");
    }
}

参考

http://blog.csdn.net/wuwenxiang91322/article/details/12231657

http://blog.csdn.net/tanyujing/article/details/9381451

欢迎入群:

公众号IT面试题汇总讨论群

如果扫描不进去,加我微信(rdst6029930)拉你。

扫我微信二维码加我

欢迎关注《IT面试题汇总》微信订阅号。每天推送经典面试题和面试心得技巧,都是干货!

微信订阅号二维码如下:

【11】-java递归和非递归二叉树前序中序后序遍历的更多相关文章

  1. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  2. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  3. JAVA递归、非递归遍历二叉树(转)

    原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...

  4. java实现二叉树的前中后遍历(递归和非递归)

    这里使用下图的二叉树作为例子: 首先建立树这个类: public class Node { private int data; private Node leftNode; private Node ...

  5. C实现二叉树(模块化集成,遍历的递归与非递归实现)

    C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...

  6. java扫描文件夹下面的所有文件(递归与非递归实现)

    java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...

  7. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

  8. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  9. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  10. 【Weiss】【第03章】练习3.11:比较单链表递归与非递归查找元素

    [练习3.11] 编写查找一个单链表特定元素的程序.分别用递归和非递归实现,并比较它们的运行时间. 链表必须达到多大才能使得使用递归的程序崩溃? Answer: 实现都是比较容易的,但是实际上查找链表 ...

随机推荐

  1. UNIX环境高级编程——标准IO-实现查看所有用户

    #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h&g ...

  2. Android项目开发填坑记-9patchPng报错

    如果阅读体验不佳,请使用–> Github版 背景 之前写了一篇文章Android必知必会–NinePatch图片制作详细介绍了Android 9Patch图片的制作和一些Demo展示,这次说明 ...

  3. TortoiseSVN文件夹图标不显示

    伴随着十二月的脚步,小编带领的市委组织部项目有条不紊的进行着,在最近的项目中遇到一个问题TortoiseSVN文件夹的图标不显示,为什么小编已经安装好TortoiseSVN了,发现文件夹的图标还是系统 ...

  4. 【java集合框架源码剖析系列】java源码剖析之HashSet

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...

  5. UNIX网络编程——客户/服务器程序设计示范(总结)

    (1)当系统负载较轻是,每来一个客户请求现场派生一个子进程为之服务的传统并发服务器程序模型就足够了.这个模型甚至可以与inetd结合使用,也就是inetd处理每个连接的接收.我们的其他意见是就重负荷运 ...

  6. Linux上程序调试的基石(1)--ptrace

    引子: 1.在Linux系统中,进程状态除了我们所熟知的TASK_RUNNING,TASK_INTERRUPTIBLE,TASK_STOPPED等,还有一个TASK_TRACED.这表明这个进程处于什 ...

  7. JavaScript中的三种弹出对话框

    学习过js的小伙伴会发现,我们在一些实例中用到了alert()方法.prompt()方法.prompt()方法,他们都是在屏幕上弹出一个对话框,并且在上面显示括号内的内容,使用这种方法使得页面的交互性 ...

  8. ASP.NET实现网页版小优盘

    今天看到了一篇不错的文章,就拿来一起分享一下吧. 实现的是文件的上传与下载功能. 关于文件上传: 谈及文件上传到网站上,首先我们想到的就是通过什么上传呢?在ASP.NET中,只需要用FileUploa ...

  9. Dynamics CRM 导入用户数据错误 could not retrieve salesperson role

    在CRM中通过导入数据的方式创建用户时报下图中的错误,"could not retrieve saleperson role".原因是系统中的自带的salesperson安全角色被 ...

  10. JAVA内部类_1

    使用内部类的原因: (1)可以访问该类定义所在作用域中的数据,包括私有数据. (2)可以对同一个包中的其它类隐藏起来. (3)当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷. 下面 ...