java 遍历树的四种方式

原创 2015年11月18日 11:23:28

java 遍历树的四种方式

最近做一个玫瑰图报表,数据源为TreeJson(树状json),在网上搜集下资料,和大家分享。:

  • 先序遍历
  • 中序遍历
  • 后序遍历
  • 层次遍历
public class Tree{

private Tree leftTree;

private Tree rightTree;

private Object treeValue;

public static boolean logPrintSwitch = false;

/**
 * 
 * 返回几种遍历的结果
 */

public static String preOrderTravResult = "先序遍历结果:";

public static String inOrderTravResult = "中序遍历结果:";

public static String postOrderTravResult = "后序遍历结果:";

public static String levelOrderTravResult = "层次遍历结果:";



public Tree getLeftTree() {
    return leftTree;
}

public void setLeftTree(Tree leftTree) {
    this.leftTree = leftTree;
}

public Tree getRightTree() {
    return rightTree;
}

public void setRightTree(Tree rightTree) {
    this.rightTree = rightTree;
}

public Object getTreeValue() {
    return treeValue;
}

public void setTreeValue(Object treeValue) {
    this.treeValue = treeValue;
}


public Tree(Object treeValue) {

    this.treeValue = treeValue;

}

public String toString() {

    // return "tree-"+this.treeNum;

    return treeValue + ",";

}

// leftTree,rightTree的getter和setter方法省略。。。

// stack栈用来保存相关数据

public static Stack<Tree> stack = new Stack<Tree>();

// stack显示代码行数

public static int executeNum = 1;

public static void main(String[] args) {

    System.out.println("很奇怪的现象:在打印Stack中的对象时,对象与对象之间多了一个 , ");

    // 控制开关

    // logPrintSwitch=true;

    preOrderTrav(buildTree());

    System.out.println(preOrderTravResult);

    inOrderTrav(buildTree());

    System.out.println(inOrderTravResult);

    postOrderTrav(buildTree());

    System.out.println(postOrderTravResult);

    levelTrav(buildTree());

    System.out.println(levelOrderTravResult);

}

public static Tree buildTree() {

    Tree rootTree = new Tree("A");

    Tree tLeft1 = new Tree("B");

    Tree dTree = new Tree("D");

    dTree.setLeftTree(new Tree("H"));

    Tree kTree = new Tree("K");

    dTree.setRightTree(kTree);

    tLeft1.setLeftTree(dTree);

    Tree eTree = new Tree("E");

    eTree.setRightTree(new Tree("I"));

    tLeft1.setRightTree(eTree);

    Tree tRight1 = new Tree("C");

    tRight1.setLeftTree(new Tree("F"));

    tRight1.setRightTree(new Tree("G"));

    rootTree.setLeftTree(tLeft1);

    rootTree.setRightTree(tRight1);

    return rootTree;

}

public static void logPrintln(Object str) {

    if (logPrintSwitch)

        System.out.println(str);

}

public static void logPrint(Object str) {

    if (logPrintSwitch)

        System.out.print(str);

}

public static List<Tree> treeHeap = new ArrayList<Tree>();

public static void levelTrav(Tree t) {

    logPrint(executeNum++ + ":");

    if (t != null) {

        logPrintln(t + "");

        levelOrderTravResult += t;

        if (t.getLeftTree() != null) {

            treeHeap.add(t.getLeftTree());

        }

        if (t.getRightTree() != null) {

            treeHeap.add(t.getRightTree());

        }

        if (treeHeap.size() > 0) {

            Tree tx = popHeap(treeHeap);

            levelTrav(tx);

        }

    }

}

public static void preOrderTrav(Tree t) {

    // 先序排列:根——>左——>右

    logPrint(executeNum++ + ":");

    if (t != null) {

        preOrderTravResult += t;

        logPrintln(t);

        if (t.getLeftTree() != null) {

            if (t.getRightTree() != null) {

                stack.push(t.getRightTree());

                logPrintln("------>" + stack);

            }

            preOrderTrav(t.getLeftTree());

        } else {

            if (t.getRightTree() != null) {

                preOrderTrav(t.getRightTree());

            } else if (t.getRightTree() == null && !stack.empty()) {

                Tree tempTree = stack.pop();

                preOrderTrav(tempTree);

            }

        }

    }

}

public static void inOrderTrav(Tree t) {

    logPrint(executeNum++ + ":");

    // 中序排列:左——>根——>右

    if (t != null) {

        if (t.getLeftTree() != null) {

            stack.push(t);

            logPrintln("------>" + stack);

            inOrderTrav(t.getLeftTree());

        } else {

            logPrintln(t);

            inOrderTravResult += t;

            if (t.getRightTree() != null) {

                inOrderTrav(t.getRightTree());

            } else if (t.getRightTree() == null && !stack.empty()) {

                Tree tempTree = stack.pop();

                tempTree.setLeftTree(null);

                inOrderTrav(tempTree);

            }

        }

    }

}

public static void postOrderTrav(Tree t) {

    logPrint(executeNum++ + ":");

    // 后序排列:左——>右——>根

    if (t != null) {

        if (t.getLeftTree() != null) {

            stack.push(t);

            logPrintln("------>" + stack);

            postOrderTrav(t.getLeftTree());

        } else {

            if (t.getRightTree() != null) {

                stack.push(t);

                logPrintln("------>" + stack);

                postOrderTrav(t.getRightTree());

            } else if (t.getRightTree() == null) {

                logPrintln(t);

                postOrderTravResult += t;

                if (!stack.empty()) {

                    Tree tx = stack.pop();

                    logPrintln("------>" + stack);

                    int relationx = getRelation(t, tx);

                    if (relationx == -1) {

                        tx.setLeftTree(null);

                        if (tx.getRightTree() != null) {

                            stack.push(tx);

                            logPrintln("------>" + stack);

                            postOrderTrav(tx.getRightTree());

                        } else {

                            postOrderTrav(tx);

                        }

                    } else if (relationx == -2) {

                        tx.setRightTree(null);

                        postOrderTrav(tx);

                    }

                }

            }

        }

    }

}

public static int getRelation(Tree t1, Tree t2) {

    /**
     * 判断前者与后者是什么关系
     * 
     * 默认t1为父树,t2为子树
     * 
     * 返回值 1 则t2是t1的左子树,2 则t2是t1的右子树,0表示两者没有联系
     * 
     * 返回值为负值,-1 则t1是t2的左子树,-2 则t1是t2的右子树
     */

    if (t1.getLeftTree() != null) {

        if (t1.getLeftTree().toString().equals(t2.toString()))

            return 1;

    }

    if (t1.getRightTree() != null) {

        if (t1.getRightTree().toString().equals(t2.toString()))

            return 2;

    }

    if (t2.getLeftTree() != null) {

        if (t2.getLeftTree().toString().equals(t1.toString()))

            return -1;

    }

    if (t2.getRightTree() != null) {

        if (t2.getRightTree().toString().equals(t1.toString()))

            return -2;

    }

    return 0;

}

public static Tree popHeap(List<Tree> heapList) {

    Tree tempTree = null;

    if (heapList != null && heapList.size() > 0) {

        tempTree = heapList.get(0);

        heapList.remove(tempTree);

    }

    return tempTree;

}

}

java使用递归,非递归方式实现二叉树的三种常见遍历方式

二叉树的定义: 二叉树(binary tree)是结点的有限集合,这个集合或者空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成. 从定义可以看出,二叉树包括:1.空树 2.只有一...
  • lr131425
  • lr131425
  • 2017年03月07日 10:48
  • 2532

java 递归遍历树形结构

//菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray chi...
  • h70614959
  • h70614959
  • 2014年05月04日 18:19
  • 46740

java多叉树的实现类,完成树的初始化和遍历

在java编程中,经常会用到创建树形结构的菜单或者目录结构,这就需要设计一个树形类,帮助实现类似功能。本文从其他地方摘抄了一个多叉树类设计,包括两个文件(TreeNode.java和TreeHelpe...
  • shanzhizi
  • shanzhizi
  • 2013年10月25日 16:45
  • 15378

Java 递归遍历组织树

给定目录,遍历所有子目录import java.io.File;public class Test { // 文件所在的层数 private int fileLevel; ...
  • myvanguard
  • myvanguard
  • 2017年07月01日 10:15
  • 319

重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现

读完本文你将了解到: 什么是二叉树 Binary Tree 两种特殊的二叉树 满二叉树 完全二叉树 满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二叉树节点...
  • u011240877
  • u011240877
  • 2016年11月17日 02:03
  • 7736

二叉树的三种遍历方式java实现

二叉树的定义 二叉树(binary tree)是结点的有限集合,这个集合或者空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成. 从定义可以看出,二叉树包括:1.空树 2.只有...
  • GFJ0814
  • GFJ0814
  • 2016年06月11日 19:24
  • 10442

二叉树的遍历 递归非递归 思路和 java实现

二叉树遍历首先弄清遍历流程。 中序遍历:第一次经过从它找左,第二次经过找右,第三次经过回来。第二次经过访问它。 算法实现: 第二次访问是 pop(&S,&p);Visit(p->da...
  • clam_clam
  • clam_clam
  • 2011年10月05日 16:40
  • 27596

二叉树的四种遍历(java代码)

代码1:四种遍历方式package 第四章; import java.util.LinkedList; /** * @author 许湘扬 * @email 547139255@qq.com ...
  • aa8568849
  • aa8568849
  • 2017年04月19日 18:49
  • 876

java遍历树(深度遍历和广度遍历)

java遍历树 如现有以下一颗树:A     B          B1               B11          B2               B22     C         ...
  • akon_vm
  • akon_vm
  • 2013年11月27日 15:43
  • 9812

java实现遍历树形菜单方法——设计思路【含源代码】

在开发中我们经常会遇到左边是树形菜单,右边是一个显示列表,单击左边的树形菜单项时,右边会显示该菜单里面相对应的内容。那么左边的树形菜单怎么从数据库里面获取数据在遍历实现呢?我们不妨来看看设计思路。  ...
  • qq_34137397
  • qq_34137397
  • 2017年05月23日 19:14
  • 5845
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 遍历树的四种方式
举报原因:
原因补充:

(最多只允许输入30个字)