美文网首页程序员
二叉树的非递归遍历一(先序/JAVA)

二叉树的非递归遍历一(先序/JAVA)

作者: 林天涯 | 来源:发表于2017-12-31 15:01 被阅读0次

前言


二叉树的非递归遍历对于初学者来说可能不太容易掌握,其实它源于递归遍历,只是把递归栈换成了我们自己的栈。掌握了这一点,无论是先序中序还是后序都非常简单。

思路


按照先序“根左右”的原则,沿着左子树向下,先访问根节点,并将其压入栈中(目的是便于后面遍历右子树有结点可依)直到结点为空(到达了最左端),由于此时需要访问右子树,因而需要退栈,访问退栈结点的右孩子。而后继续循环(又沿左子树向下遍历)直到栈空为止。

代码


/**
 * 定义二叉树结构
 * @author Fairy2016
 *
 */
class BiTree {
    int data;
    BiTree lchild;
    BiTree rchild;
}
/**
 * 定义栈结构
 * @author Fairy2016
 *
 */
class Stack {
    BiTree nodes[];
    int top;
}
/**
 * 遍历
 * @author Fairy2016
 *
 */
public class BiTreeThrough {
    //根据给定序列,建立完全二叉树
    public static BiTree CreateCompleteBiTree(int a[], int n) {
        BiTree nodes[] = new BiTree[n];
        //初始化各结点
        for(int i = 0; i < n; i++) {
            nodes[i] = new BiTree();
            nodes[i].data = a[i];
            nodes[i].lchild = nodes[i].rchild = null;
        }
        //将各结点按照完全二叉树的关系连起来(其实就是奇左偶右)
        for(int i = 1; i <= n/2; i++) {
            nodes[i-1].lchild = nodes[2*i-1];
            if(2*i < n) {
                nodes[i-1].rchild = nodes[2*i];
            }
        }
        //返回根结点
        return nodes[0];
    }
    //递归遍历
    public static void ReCuPreOrder(BiTree T) {
        if(T != null) {
            System.out.print(T.data+" ");
            ReCuPreOrder(T.lchild);
            ReCuPreOrder(T.rchild);
        }
    }
    //非递归遍历
    public static void NotReCuPreOrder(BiTree T) {
        //栈初始化
        Stack S = new Stack();
        S.top = -1;
        S.nodes = new BiTree[100];
        BiTree p = T;
        //遍历
        while(p != null || S.top != -1) {
            if(p != null) {
                System.out.print(p.data+" ");//访问
                S.nodes[++S.top] = p;//入栈
                p = p.lchild;//沿左子树向下
            } else {
                p = S.nodes[S.top--];//出栈
                p = p.rchild;//沿右子树
            }
        }
    }
    //执行
    public static void main(String args[]) {
        int a[] = {1,2,3,4,5,6,7,8};
        int n = 8;
        BiTree T = CreateCompleteBiTree(a, n);
        NotReCuPreOrder(T);
    }
}

相关文章

  • Java二叉树的遍历

    Java二叉树的遍历 利用递归和非递归实现二叉树的先序,中序,后序遍历以及使用队列实现二叉树的层次遍历

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 二叉树递归非递归遍历算法整理

    一、二叉树前序遍历 1 前序递归遍历 2.前序非递归遍历 一、二叉树中序遍历 2.中序递归遍历 1.中序非递归遍历...

  • python遍历二叉树

    定义二叉树: 构建二叉树: BFS: 先序遍历:1.递归版本: 2.非递归版本: 中序遍历: 1.递归版本 2.非...

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • 二叉树的操作

    /*主要内容:1、实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式*/ 实现二叉树的先序、中序、后序遍历...

  • 二叉树先序、中序、后序遍历 递归与非递归 Python实现 1.先序遍历:根节点->左子树->右子树 2.中序遍历...

  • 树的遍历

    节点结构: 先序遍历 递归 非递归 后序遍历 递归 非递归 中序遍历 递归 非递归 层序遍历 类库 有了上述遍历算...

  • 树的遍历,golang实现

    先序,递归 中序,递归 后序,递归 先序,非递归 中序,非递归 后序,非递归 层序遍历

  • 二叉树遍历(先序、中序、后序)

    二叉树有多种遍历方法,有层次遍历、深度优先遍历、广度优先遍历等。 本文只涉及二叉树的先序、中序、后序的递归和非递归...

网友评论

    本文标题:二叉树的非递归遍历一(先序/JAVA)

    本文链接:https://www.haomeiwen.com/subject/wmxagxtx.html