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 递归遍历树形结构

//菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray chi...

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

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

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

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

java通过栈实现树的遍历

实现代码 实现的语言解释实现代码package traversalTree; import java.util.*; import java.util.Scanner;class NodeType{ ...

java实现遍历树形菜单方法——OpenSessionView实现

/** * @Title: OpenSessionView.java * @Package org.util * @Description: TODO该方法的主要作用: * @author A18...

Java实现通过递归遍历树形结构

树形结构在数据库的设计过程中是一种比较常见的模型,指的是各元素之间存在‘一对多’的结构模型。在树形结构中,树根结点没有前驱结点,其余每个结点有且只有一个前驱结点。叶子结点没有后续结点,其余每个结点的后...

java多叉树的生成和遍历

转载另外一个关于多叉树的实现类: TreeNode.java /* * Copyright Walker Studio * All Rights Reserved. * * 文件...

面试大总结之二:Java搞定面试中的二叉树题目

这是本系列的第二篇,与前一篇 面试大总结之一:Java搞定面试中的链表题目 相比,二叉树的题目可以变化的就更多了。本文还是参考整合重写了《轻松搞定面试中的二叉树题目》和《算法大全(3) 二叉树》两...

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

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

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

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

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