二叉树后序非递归遍历

package com.basic.bt;

import java.util.ArrayList;
import java.util.Stack;

/**
 * Created by mac on 2017/1/19.
 */
public class PostOrderBT {

    ArrayList<Integer> result = new ArrayList<Integer>();

    public void postorder(TreeNode root) {
        if(root == null) {
            return;
        }
        postorder(root.left);
        postorder(root.right);
        result.add(root.val);
    }

    public void postOrderTraversal(TreeNode root) {

        if(root == null) {
            return;
        }

        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode node = root;
        TreeNode pre = null;

        while( node != null || !stack.isEmpty()) {
            while(node != null) {
                stack.push(node);
                node = node.left;
            }

            // node指向了空,所以要pop()一下  另外也是出于 对node右孩子的考虑;
            node = stack.pop();
            while( node != null && (node.right == null || node.right == pre)) {
                result.add(node.val);
                pre = node;
                if(stack.isEmpty()) {
                    return;
                }
                node = stack.pop();
            }

            stack.push(node);
            node = node.right;
        }

    }

    public  static void main(String[] args) {
        PostOrderBT in = new PostOrderBT();
        TreeNode root = new TreeNode(0);
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);

        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node1.right =node4;

        in.postOrderTraversal(root);

        for(int i = 0; i < in.result.size(); i++) {
            System.out.println(in.result.get(i));
        }

    }

}

  

时间: 2024-11-09 20:36:33

二叉树后序非递归遍历的相关文章

【算法导论】二叉树的前中后序非递归遍历实现

二叉树的递归遍历实现起来比较简单,而且代码简洁:而非递归遍历则不那么简单,我们需要利用另一种数据结构---栈来实现.二叉树的遍历又可以分为前序.中序和后序三种,它们是按照根结点在遍历时的位置划分的,前序遍历则根结点先被遍历,中序则根结点在左右叶子节点之间被遍历,后序则是根结点最后被遍历.三种非递归遍历中,前序和中序都不是太复制,而后序遍历则相对较难. 一.前序遍历 我们这里前序遍历按照"根-左-右"的顺序来遍历.这里按照"递归--非递归"的次序来研究,之后的几种亦是

二叉树中序非递归遍历

package com.basic.bt; import java.util.ArrayList; import java.util.Stack; /** * Created by mac on 2017/1/19. */ public class InOrderBT { ArrayList<Integer> result = new ArrayList<Integer>(); ArrayList<Integer> traversal = new ArrayList&l

二叉搜索树的先序中序后序非递归遍历代码

#include<iostream>#include<stack>#include<vector>using namespace std;struct node{  int val;  node *left,*right;  node(int _val):val(_val),left(NULL),right(NULL){     } };struct bignode{ bool isfirst;  node* pnode; };void postorder(node*

二叉树学习之非递归遍历

二叉树递归遍历可谓是学过数据结构的同仁都能想一下就能写出来,但在应聘过程我们常常遇到的是写出一个二叉树非递归遍历函数,接着上篇文章写二叉树的非递归遍历,先难后易,一步一步的来. 先上代码: #include "binarytree.h" #include <stack> #include <queue> #ifndef RECU #warning("RECU is not defined") /** *前序遍历(根左右) * *1.当前节点为

C++实现二叉树的前序、中序、后序非递归扁历

这三种常见的扁历方式,是考研面试等场合经常遇到的,在此做一个总结. 1.前序遍历比较简单:用指针p指向根节点,若p!=NULL且栈非空,则直接访问节点,并将节点的右孩子入栈,同时指针p向左孩子移动. 2.中序扁历:用指针p指向根节点,若p!=NULL且栈非空,则当前节点入栈,同时指针p向左孩子移动,出栈是指针指向当前节点的右孩子. 3.后序扁历相对复杂:需要设置一个辅助栈,标识该节点是否是第二次出栈,只有第二次出栈的节点才可被访问. 具体实现就不啰嗦了,直接上代码吧! #include <sta

二叉树的先序非递归遍历(注释版)

/* No recusive to realize the travle of tree */ void NoPreOrder( BiTree root ) {/*{{{*/ Stack S; BiTree P; P = root; S = CreateStack(); while( P!=NULL || !IsEmpty(S) )//判断条件分别对应着 //1,S is not empty && P = NULL 当前节点为上一节点的右子树,右子树为空,但还有上一节点的上一节点的右子树

二叉树的中序非递归遍历思想

#include<stdio.h> #include<stdlib.h> #define OK 1 #define  ERROR 0 typedef struct node { int data; struct node *lchild; struct node *rchild; } Node,Tree; /* www.quzhuanpan.com 解释全来自去转盘网,转载请告知 */ typedef Node *ElemType; typedef Tree *AnoElemTyp

递归非递归的二叉树遍历(递归前中后,非递归前中后,层次遍历,凹入打印法等)

由于所有的递归算法都可以借助于堆栈转换成循环结构的非递归算法.方法一:形式化模拟转换.方法二:根据要求解问题的特点设计借助于堆栈的循环结构算法.而此次正好是利用第二种按方法求解. 1.1非递归前序遍历: 首先利用下图来设计非递归前序遍历算法思想: 堆栈结构体如下: #define size 100 typedef struct { DataType data[size]; int tag[100]; //这个是在非递归后序中用到 int top : }SeqStack : (1)初始化设置一个堆

二叉树递归与非递归遍历,最近公共父节点算法

#include <iostream> #include <stack> using namespace std; #define MAX 100 //字符串最大长度 typedef struct Node //二叉树结点 { char data; Node *lchild,*rchild; } *Btree; void createBT(Btree &t); //先序构造二叉树 void preorder(Btree &t); //二叉树递归先序遍历 void i