二叉树的非递归遍历--中序遍历

package algorithm;

import java.util.Stack;
class TreeNode<T> {
    T data;
    TreeNode left;
    TreeNode right;
     public TreeNode(T data, TreeNode left, TreeNode right) {  
         super();  
         this.data = data;  
         this.left = left;  
         this.right = right;  
     }
      public TreeNode(T data){  
          this.data=data;  
      }  
}
public class InOrderTraverse {

public static void  inOrderTraverse(TreeNode root) {
        Stack stack = new Stack();
        
        while(root != null || !stack.isEmpty()) {
            if (root!=null) {
                stack.push(root);
                root=root.left;
            } else {
                visit((TreeNode)stack.peek());
                root = (TreeNode)stack.pop();
                root = root.right;
            }
        }
    }
    private static void  visit(TreeNode p) {
        System.out.println(p.data);
    }
    public static void main(String[] args) {
        TreeNode<Integer> e = new   TreeNode<Integer>(5);
        TreeNode<Integer> g = new   TreeNode<Integer>(7);
        TreeNode<Integer> h = new   TreeNode<Integer>(8);

TreeNode<Integer> l = new   TreeNode<Integer>(12);
        TreeNode<Integer> m = new   TreeNode<Integer>(13);
        TreeNode<Integer> n = new   TreeNode<Integer>(14);
        TreeNode<Integer> k = new   TreeNode<Integer>(11, n, null);
        TreeNode<Integer> j = new   TreeNode<Integer>(10, l, m);
        TreeNode<Integer> i = new   TreeNode<Integer>(9, j, k);
        TreeNode<Integer> d = new   TreeNode<Integer>(4, null, g);

TreeNode<Integer> f = new   TreeNode<Integer>(6, h, i);
        TreeNode<Integer> b = new   TreeNode<Integer>(2, d, e);
        TreeNode<Integer> c = new   TreeNode<Integer>(3, f, null);
       
        TreeNode<Integer> root = new   TreeNode<Integer>(1, b, c);
        inOrderTraverse(root);

}

}

时间: 2024-10-10 06:18:22

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

[C++]LeetCode: 93 Binary Search Tree Iterator (经典题,非递归的中序遍历)

题目: Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST. Calling next() will return the next smallest number in the BST. Note: next() and hasNext() should run in average O(1) time and u

根据先序遍历中序遍历重建二叉树

根据先序遍历和中序遍历的特点,我们想到了采用递归的方法来实现. 思路:1) 代码的容错性检查,比如:先序遍历和中序遍历长度应相等 2) 先保存先序遍历的第一个点,这个点为结点,接下来循环中序遍历,直到midOrd[index]=该结点,那么接下来就可以采用递归,分别对结点左边和右边的序列采用相同的方法. 3) 直到中序遍历中的序列中只含一个点,整个过程结束. 下面是我写的代码,一直显示错误,不知道什么原因. // 先序中序重建二叉树.cpp : Defines the entry point f

非递归实现先序遍历 java leecode 提交

写完才知道自己学习都是似是而非啊,大家可以也在leecode上提交代码,纯手写,离开eclipse第一种方式:数据结构书上的,使用栈大概思路.1.不断将根节点的左孩子的左孩子直到为空,在这个过程入栈.2.因为栈顶的节点的左孩子为空,所以栈顶的的节点的左子树肯定访问完毕,所以出栈后直接指向右孩子.其实这里面有个思想迭代和递归的本质相同之处是什么?以后会写一篇我的思考. public class Solution { public List<Integer> preorderTraversal(T

树的非递归遍历(中序遍历)

中序 遍历的几种情况 分析1:什么时候访问根.什么时候访问左子树.什么访问右子树 当左子树为空或者左子树已经访问完毕以后,再访问根 访问完毕根以后,再访问右子树. 分析2:非递归遍历树,访问结点时,为什么是栈,而不是其他模型(比如说是队列). 先走到的后访问.后走到的先访问,显然是栈结构 分析3:结点所有路径情况 步骤1: 如果结点有左子树,该结点入栈: 如果结点没有左子树,访问该结点: 步骤2: 如果结点有右子树,重复步骤1: 如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素

二叉树(15)----由中序遍历和后序遍历重建二叉树,递归方式

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.由中序遍历和后序遍历重建二叉树 中序遍历中,根节点总是位于左右子树

二叉树先序遍历中序遍历求后序遍历

先序遍历:根 左 右 中序遍历:左 根 右 后序遍历:左 右 根 我们可以先从先序遍历中找到根节点,由于知道了根节点那么可以依靠中序遍历找到左子树,右子树.这样再去先序遍历中找到左子树的根节点,然后再依靠中序遍历找到左子树的左子树(右子树同理).这样层层递归就能还原二叉树.之后求出后序遍历. 感谢原博主http://www.cnblogs.com/rain-lei/p/3576796.html 一开始递归不会写,看了博主的发现其实很简单.注意还原二叉树时return root. #include

二叉树前序遍历+中序遍历-&gt;后序遍历

BNU的基础题,数据结构的基础题,顺便搞下. 二叉树是一种常用的数据结构.我们可以用大写的英文字母表示二叉树的节点. 如下: B / \ / \ C A D 对于二叉树,有前序.中序和后序三种遍历方式. 现在给你一棵二叉树的前序和中序遍历,请你求出这棵二叉树的后序遍历结果. Input 输入数据有多组,每组数据一行. 每行由两个字符串组成(每个字符串长度最大为26).表示一棵二叉树的前序和中序遍历结果. 题目保证前序和中序遍历是合法的(即肯定可以确定一棵二叉树). Output 对于每组输入,输

简单的二叉树的创建(前序输入)&amp;前序遍历&amp;中序遍历&amp;后序遍历

#include <stdio.h> #include <stdlib.h> #define MAX 1024 typedef struct bitnode { int data; struct bitnode *lchild; struct bitnode *rchild; }BinTree; BinTree *Creat_Bintree() { BinTree *p; int x; scanf("%d",&x); if(x==0) { p = NUL

LeetCode-重建二叉树(前序遍历+中序遍历)

重建二叉树 LeetCode-105 首次需要知道前序遍历和中序遍历的性质. 解题思路如下:首先使用前序比遍历找到根节点,然后使用中序遍历找到左右子树的范围,再分别对左右子树实施递归重建. 本题的难点就是如何在前序遍历中找到左右子树的范围以分别重构,这可以根据中序遍历中的左右子树的数量来分辨.使用前序遍历的根节点和中序遍历的根节点相同时,表示此时前序遍历的左子树已经找到了. 具体的实施时需要带有4个参数分别控制左右子树的范围. /** * 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.

新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)

题目:将一个二叉查找树按照中序遍历转换成双向链表. 给定一个二叉查找树: 4 / 2 5 / 1 3 返回 1<->2<->3<->4<->5. 思路:如果对于当前节点,把右子树转换成双向链表,然后把左子树转换成双向链表,转换的时候我们都标记了链表的头节点和尾节点,那么只需要将当前节点和左子树的尾部相连,和右子树的头部相连即可. Java代码:这个是借鉴九章里面的解题法.但是对于左右子树转换成二叉树也不是很理解,还待需要继续分析. /** * Definit