非递归方式遍历二叉树

  /**
     * 非递归方式的先根序
     * @param root
     */
    public static void preOrder(Node root){
        Stack<Node> stack = new Stack<Node>();
        while (!stack.isEmpty() || root != null) {
        	while (root != null) {
        		System.out.println(root.data);
        		stack.push(root);
        		root = root.left;
        	}

        	if (!stack.isEmpty()) {
        		root = stack.pop();
        		root = root.right;
        	}
        }

    }

    /**
     * 非递归的方式中根序遍历二叉树
     * @param node
     */
    public static void orderBinaryTree(Node node) {
    	Stack<Node> stack = new Stack<Node>();
    	Node point = node;
    	while (!stack.isEmpty() || point != null) {
    		//如果左子树不为空,则一直入栈
    		if (point != null) {
    			stack.push(point);
    			point = point.left;
    		} else {
    			point = stack.peek();
    			visit(point);
    			point = point.right;
    			stack.pop();
    		}
    	}
    }

    /**
     * 非递归方式后根序
     * @param node
     */
    public static void lastOrder(Node node) {
    	Stack<Node> stackNode = new Stack<Node>();
    	Stack<Integer> stackInt = new Stack<Integer>();
    	int i = 1;
    	while (!stackNode.isEmpty() || node != null) {
    		while(node != null) {
    			stackNode.push(node);
    			stackInt.push(0);
    			node = node.left;
    		}
    		while (!stackNode.isEmpty() && stackInt.peek() == i) {
    			stackInt.pop();
    			System.out.println(stackNode.pop().data);
    		}

    		if (!stackNode.isEmpty()) {
    			stackInt.pop();
    			stackInt.push(1);
    			node = stackNode.peek();
    			node = node.right;
    		}
    	}
    }

  创建一棵二叉树:

public class Node {
	Node left = null;
	Node right = null;
	Integer data;
	/**
	 *
	 * @param root
	 */
	public Node() {
		this.left = null;
		this.right = null;
		this.data = null;
	}

	public Node(Integer data) {
		this.left = null;
		this.right= null;
		this.data = data;
	}

}

  

时间: 2024-10-03 21:43:09

非递归方式遍历二叉树的相关文章

用递归方式遍历二叉树

问题 思路说明 遍历二叉树的方法有广度优先和深度优先两类,下面阐述的是深度优先. 以下图的二叉树为例: 先定义三个符号标记: 访问结点本身(N) 遍历该结点的左子树(L) 遍历该结点的右子树(R) 有四种方式: 前序遍历(PreorderTraversal,NLR):先访问根结点,然后遍历其左右子树 中序遍历(InorderTraversal,LNR):先访问左子树,然后访问根节点,再访问右子树 后序遍历(PostorderTraversal,LRN):先访问左右子树,再访问根结点 层序遍历(l

数据结构 递归和非递归方式实现二叉树先序、中序和后序遍历

二叉树的先序遍历顺序是根.左.右:中序遍历顺序是左.根.右:后序遍历顺序是左.右.根. 递归方式实现如下: 1 public class TreeNode { 2 private int value; 3 private TreeNode left, right; 4 5 public TreeNode(int data) { 6 value = data; 7 } 8 9 // 递归方式实现先序遍历 10 public void preorder(TreeNode treeNode) { 11

非递归前序遍历二叉树

#include<stdio.h> #include<stdlib.h> //定义结构体 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiNode,* pBiNode; pBiNode stack[100]; void later(pBiNode * p) //前序创建树 { char ch; scanf("%c",&ch); if(ch=='#') *p=NU

非递归实现遍历二叉树

非递归实现二叉树主要利用queue和stack的特点,对于层次遍历二叉树主要运用queue队头出,队尾插入,先进先出的特点,先将根插入队尾,然后输出队头的元素,同时将队头的左子树和右子树元素插入队尾,依次输出输出队头的元素,同时将队头的左子树和右子树元素插入队尾,直到队列为空. void levelorder() { queue<BinaryTreeNode<T> *>s; if (_root == NULL) return; s.push(_root); while (!s.em

递归方式遍历二叉树:

/* * 先根序 */ public static void beforeShow(Node node) { if (node == null) { return; } System.out.println(node.data); beforeShow(node.left); beforeShow(node.right); } /* * 中根序 */ public static void middleShow(Node node) { if (node == null) { return; }

非递归方式遍历文件夹,取得所有子目录和文件的文件名和大小

void BuildTree() { FileNode nodeD; nodeD.fileName = _T("D"); nodeD.fileSize = 15; FileNode nodeE; nodeE.fileName = _T("E"); nodeE.fileSize = 10; FileNode nodeF; nodeF.fileName = _T("F"); nodeF.fileSize = 20; FileNode nodeG; n

二叉树(3)----后序遍历,递归和非递归方式

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.后序遍历 定义: 给定根节点,首先遍历左子树,然后遍历右子树,最后

二叉树的遍历(基于栈的非递归方式实现)

在写二叉树的时候如果用递归实现二叉树的遍历很简单,但是用非递归来实现二叉树的遍历就不那么简单了需要一些技巧. 那为什么还要非递归实现呢?个人理解:如果树的高度很大,超过了允许递归的次数,那么就会出错,比如我记得python只允许递归100次(不知道记错没) 这时候用迭代就要保险的多,不会出错. 下面先来做基本的准备说明: 1 #include<iostream> 2 #include<stack> 3 4 #define null NULL 5 6 template<type

二叉树(11)----求二叉树的镜像,递归和非递归方式

1.二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树镜像 比如: A