二叉树遍历算法之二:中序遍历

中序遍历的递归实现

中序遍历遍历指的是先访问二叉树中节点的左孩子,再访问当前节点,最后再访问其右孩子。具体访问步骤如下:

  1. 首先访问根节点,判断根节点是否有左孩子,如果有,进行第二步;如果没有,跳到第三步;
  2. 访问左孩子,继续判断当前节点是否有左孩子,如果有则继续访问其左孩子,直到某节点的左孩子为空
  3. 判断是否有右孩子,如果有,则继续判断当前节点是否有左孩子,一直到某节点没有左孩子为止
  4. 把第二步访问的节点做为当前节点(该节点无左孩子,如图中的15节点),按照规则,下一步应该访问其右孩子
  5. 返回到第四部节点的双亲节点(15的双亲节点是5),并设为当前访问的节点,下一步访问的是其右孩子(这里5没有右孩子)
  6. 继续访问第五步访问节点的双亲节点(5的双亲节点是6),下一步仍然访问其右孩子。
  7. 左子树访问完毕,继续第三步中右子树的访问,步骤与上面一直,最终每个节点都将访问一遍

仍然以上一篇博客中前序遍历的例子作为说明:

按照中序遍历的访问规则,最终的输出序列应该是15,24,5,6,7,8,30,9,10,11,28

可以发现这是一个递归过程,其递归代码也很简单,代码如下:

package com.rhwayfun.algorithm.tree;

public class TravelTree {

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int val) {
            this.val = val;
        }
    }

    public void inOrderTraverse(TreeNode node) {
        if (node == null)
            return;
        inOrderTraverse(node.left);
        System.out.print(node.val + " ");
        inOrderTraverse(node.right);
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(8);
        TreeNode node1 = new TreeNode(6);
        TreeNode node2 = new TreeNode(10);
        TreeNode node3 = new TreeNode(5);
        TreeNode node4 = new TreeNode(7);
        TreeNode node5 = new TreeNode(9);
        TreeNode node6 = new TreeNode(11);
        TreeNode node7 = new TreeNode(15);
        TreeNode node8 = new TreeNode(24);
        TreeNode node9 = new TreeNode(30);
        TreeNode node10 = new TreeNode(28);

        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node3.left = node7;
        node7.right = node8;
        node1.right = node4;
        node2.left = node5;
        node2.right = node6;
        node5.left = node9;
        node6.right = node10;

        new TravelTree().inOrderTraverse(root);
    }
}

中序遍历的非递归实现

下面我们讨论一下非递归实现,与上一篇前序遍历的非递归实现由一些类是,主要的访问次序的改变,所以只需要在前面代码的基础上做一些适当修改就可以了,下面是对中序遍历代码的实现(经测试可用):

public void inOrderTraverse2(TreeNode node){
        Stack<TreeNode> s = new Stack<TreeNode>();
        while(node != null || !s.isEmpty()){
            //遍历左子树
            while(node != null){
                s.push(node);
                node = node.left;
            }
            //遍历右子树
            if(!s.isEmpty()){
                node = s.pop();
                System.out.print(node.val + " ");
                node = node.right;
            }
        }
    }
时间: 2024-09-10 15:47:27

二叉树遍历算法之二:中序遍历的相关文章

二叉树遍历算法之三:后序遍历

后续遍历的递归实现 后续遍历指的是先访问节点的左右孩子,最后访问节点本身.所以使用后序遍历得到的结果的最后一个节点就是根节点.采用后续遍历的具体步骤如下: 先访问根节点,如果有左孩子,进入第二步:如果有右孩子,进入第三步 对左孩子继续判断其是否有左孩子,直到某节点的左孩子为空,设为cur节点 对右孩子继续判其是否有左孩子,直到某个节点的左孩子为空,设为curR节点 cur节点访问之后,访问其双亲节点的右孩子,如果其双亲节点的右孩子不为空的话.接着访问cur节点的双亲节点,设为curP节点. cu

数据结构 排序二叉树(BST) 插入删除查询 中序遍历 销毁(后序遍历)

结构概念如下: 二叉排序树(binary sort tree): 1.也叫做二叉查找树 2.如果他的左子树不为空,则左子树上所有结点的 值均小于他的根结构的值 3.如果他的右子树不为空,则右子树上所有结点的 值均大于他的根结构的值 4.他的左右子树分别为二叉排序树 5.按照二叉树中序遍历其返回结果树有序的 下面就是一颗典型的二叉树,只是是字母,可以将字母换位字母的顺序进行审视,但是它不是平衡二叉树 排序二叉树(BST)的优点在于进行数据查找比较方便,因为他是按照数据来到的顺序进行如上的规则进行的

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

问题描述 二叉树的非递归操作.. 如何用栈实现二叉树的非递归操作,越详细越好,谢谢各位啦.一定要详细哦 解决方案 void inOrder2(BinTree *root) //非递归中序遍历 { stack<BinTree*> s; BinTree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); cout<<

c语言-已知二叉树的中序遍历序列与层次遍历序列分别存于数组A[1-n] B[1-n]中,建立二叉树的二叉链表。

问题描述 已知二叉树的中序遍历序列与层次遍历序列分别存于数组A[1-n] B[1-n]中,建立二叉树的二叉链表. 已知二叉树的中序遍历序列与层次遍历序列分别将值存于数组A[1-n].B[1-n]中,请编程建立二叉树的二叉链表. 二叉树结点定义 typedef struct { Elemtype data; BiNode* lchild,rchild; }BiNode,*BiTree; 解决方案 http://www.zybang.com/question/23e04267bb862ea67197

二叉树系列(二):已知中序遍历序列和后序遍历序列,求先序遍历序列

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍:   1.先序遍历   (1)访问根结点:   (2)先序遍历左子树:   (3)先序遍历右子树.   2.中序遍历   (1)中序遍历左子树:   (2)访问根结点:   (3)中序遍历右子树.   3.后序遍历   (1)后序遍历左子树:   (2)后序遍历右子树:   (3)访问根结点.   知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和

UVa 548:Tree 二叉树的重建——中序遍历与后续遍历进行建树

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=489 题目类型: 数据结构, 二叉树 题目大意: 给两个组数字,都是在同一棵二叉树上的,第一组是按中序遍历(inorder)顺序输出的,第二组是按后序遍历(postorder)输出的, 根据这两组数据构建出原来的二叉树,然后计算从根结点到每个叶子结

知道二叉树的后序遍历和中序遍历求深度的代码那有错?

问题描述 知道二叉树的后序遍历和中序遍历求深度的代码那有错? #include #include #include char zhongxu[100]; char houxu[100]; struct node { char data; struct node *l,*r; }*T,*TT; int treedepth(struct node *TT) { int i,j; if(!TT) return 0; i=treedepth(TT->l); j=treedepth(TT->r); re

c语言-大神求教C语言,知道二叉树先序中序遍历序列,求后序遍历序列。

问题描述 大神求教C语言,知道二叉树先序中序遍历序列,求后序遍历序列. #include#include#include using namespace std; typedef struct Btree{ struct Btree *left; struct Btree *right; char data;}Node; void Create_Btree(Node *tree char *pre int pre_low int pre_high char *middle int middle_

中序遍历-为什么二叉树的中序非递归算法无法实现

问题描述 为什么二叉树的中序非递归算法无法实现 // 实验三.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include using namespace std; #define true 1 #define false 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 typedef char TElemType; typedef int Stat