欢迎使用CSDN-markdown编辑器

来源:互联网 发布:国密算法标准 编辑:程序博客网 时间:2024/06/02 02:42

#

package cc.it1000.test;
/**
* 表示树节点的类
*
* @author xdsjs
*
* @param
* 结点数据域类型
*/
public class BinNode {

private BinNode<T> leftNode;// 左结点private BinNode<T> rightNode;// 右结点private T dataValue;// 数据域public BinNode() {}public BinNode(T dataValue) {    super();    this.dataValue = dataValue;}public BinNode(BinNode<T> leftNode, BinNode<T> rightNode, T dataValue) {    this.leftNode = leftNode;    this.rightNode = rightNode;    this.dataValue = dataValue;}public BinNode<T> getLeftNode() {    return leftNode;}public void setLeftNode(BinNode<T> leftNode) {    this.leftNode = leftNode;}public BinNode<T> getRightNode() {    return rightNode;}public void setRightNode(BinNode<T> rightNode) {    this.rightNode = rightNode;}public T getData() {    return dataValue;}public void setData(T data) {    this.dataValue = data;}

}

#

package cc.it1000.test;

import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.LinkedBlockingQueue;

/**
* 简单的二叉树构造
*
* @author xdsjs
* @param
*
*/
public class BinTree {

private BinNode<T> rootNode;// 根节点public BinTree() {}public BinTree(BinNode<T> rootNode) {    this.rootNode = rootNode;}/** * 得到整棵树的高度 * * @return */public int getHeight() {    return getHeight(rootNode);}/** * 利用递归得到某一结点的高度 * * @param binNode *            目标结点 * @return */public int getHeight(BinNode<T> binNode) {    if (binNode == null)        return 0;    int i = getHeight(binNode.getLeftNode());    int j = getHeight(binNode.getRightNode());    return i < j ? j + 1 : i + 1;}/** * 递归得到整棵树的size(即结点数) * * @return */public int getSize() {    return getSize(rootNode);}/** * 得到某一子树的size(即结点数) * * @param binNode * @return */public int getSize(BinNode<T> binNode) {    if (binNode == null)        return 0;    return 1 + getSize(binNode.getLeftNode()) + getSize(binNode.getRightNode());}/** * 判断二叉树是否为空树 * * @return */public boolean isEmpty() {    return rootNode == null;}/** * 得到整棵树下某一结点的双亲结点 * * @param binNode *            某一结点 * @return */public BinNode<T> getParent(BinNode<T> binNode) {    return (binNode == null || binNode == rootNode) ? null : getParent(rootNode, binNode);}/** * 递归得到某子树下某结点的双亲结点 * * @param subTree *            某子树 * @param binNode *            某结点 * @return */public BinNode<T> getParent(BinNode<T> subTree, BinNode<T> binNode) {    if (subTree == null || binNode == null || subTree == binNode || binNode == rootNode)        return null;    if (subTree.getLeftNode() == binNode || subTree.getRightNode() == binNode)        return subTree;    BinNode<T> b;    if (getParent((b = subTree.getLeftNode()), binNode) != null)        return b;    return getParent(subTree.getRightNode(), binNode);}/** * 得到某一结点的左孩子结点 * * @param binNode * @return */public BinNode<T> getLeftBinNode(BinNode<T> binNode) {    return (binNode == null) ? null : binNode.getLeftNode();}/** * 得到某一结点的右孩子结点 * * @param binNode * @return */public BinNode<T> getRightBinNode(BinNode<T> binNode) {    return (binNode == null) ? null : binNode.getRightNode();}public BinNode<T> getRoot() {    return this.rootNode;}/** * 删除整棵树 */public void deleteTree() {    deleteTree(rootNode);}/** * 删除某子树(同时将其左右子树全部删除) * * @param binNode */public void deleteTree(BinNode<T> binNode) {    if (binNode == null)        return;    deleteTree(binNode.getLeftNode());    deleteTree(binNode.getRightNode());    binNode = null;}/** * 访问某结点 * * @param subTree */public void visted(BinNode<T> subTree) {    System.out.println("--name:" + subTree.getData());}/** * 先序遍历(递归形式) * * @param subTree */public void preOrderTraverse(BinNode<T> subTree) {    if (subTree == null)        return;    visted(subTree);    preOrderTraverse(subTree.getLeftNode());    preOrderTraverse(subTree.getRightNode());}/** * 中序遍历(递归形式) * * @param subTree */public void middleOrderTraverse(BinNode<T> subTree) {    if (subTree == null)        return;    middleOrderTraverse(subTree.getLeftNode());    visted(subTree);    middleOrderTraverse(subTree.getRightNode());}/** * 后序遍历(递归形式) * * @param subTree */public void postOrderTraverse(BinNode<T> subTree) {    if (subTree == null)        return;    postOrderTraverse(subTree.getLeftNode());    postOrderTraverse(subTree.getRightNode());    visted(subTree);}/** * 先序遍历(非递归形式,效率更高) * * @param subTree */public void nrPreOrderTraverse(BinNode<T> subTree) {    if (subTree == null)        return;    Stack<BinNode<T>> stack = new Stack<BinNode<T>>();    while (true) {        while (subTree != null) {            visted(subTree);            stack.push(subTree);            subTree = subTree.getLeftNode();        }        if (stack.isEmpty())            break;        subTree = stack.pop();        subTree = subTree.getRightNode();    }}/** * 中序遍历(非递归形式) * * @param subTree */public void nrMiddleOrderTraverse(BinNode<T> subTree) {    if (subTree == null)        return;    Stack<BinNode<T>> stack = new Stack<BinNode<T>>();    while (true) {        while (subTree != null) {            stack.push(subTree);            subTree = subTree.getLeftNode();        }        if (stack.isEmpty())            break;        subTree = stack.pop();        visted(subTree);        subTree = subTree.getRightNode();    }}/** * 后序遍历(非递归) * * @param subTree */public void nrPostOrderTraverse(BinNode<T> subTree) {    if (subTree == null)        return;    Stack<BinNode<T>> stack = new Stack<BinNode<T>>();    BinNode<T> lastNode = null;// 表示最近一次访问的节点    while (true) {        while (subTree != null) {            stack.push(subTree);            subTree = subTree.getLeftNode();        }        if (stack.isEmpty())            break;        subTree = stack.peek();        if (subTree.getRightNode() == null || subTree.getRightNode() == lastNode) {            visted(subTree);            subTree = stack.pop();            lastNode = subTree;            subTree = null;        } else {            subTree = subTree.getRightNode();        }    }}/** * 层次遍历(队列实现) * * @param subTree */public void levelTraverse(BinNode<T> subTree) {    if (subTree == null)        return;    Queue<BinNode<T>> queue = new LinkedBlockingQueue<BinNode<T>>();    queue.add(subTree);    while (!queue.isEmpty()) {        BinNode<T> binNode = queue.poll();        if (binNode != null) {            visted(binNode);            if (binNode.getLeftNode() != null)                queue.add(binNode.getLeftNode());            if (binNode.getRightNode() != null)                queue.add(binNode.getRightNode());        }    }}public static void main(String[] args) {    BinTree<String> binTree = new BinTree<String>(new BinNode<String>("A"));    /**     * 创建一棵二叉树     *     * <pre>     *     *           A     *     B          C     *  D     E            F     * </pre>     *     */    BinNode<String> rootNode = binTree.getRoot();    BinNode<String> nodeB = new BinNode<String>("B");    BinNode<String> nodeC = new BinNode<String>("C");    BinNode<String> nodeD = new BinNode<String>("D");    BinNode<String> nodeE = new BinNode<String>("E");    BinNode<String> nodeF = new BinNode<String>("F");    rootNode.setLeftNode(nodeB);    rootNode.setRightNode(nodeC);    nodeB.setLeftNode(nodeD);    nodeB.setRightNode(nodeE);    nodeC.setRightNode(nodeF);    System.out.println("*******先序遍历(递归形式)*******");    binTree.preOrderTraverse(rootNode);    System.out.println("*******中序遍历(递归形式)*******");    binTree.middleOrderTraverse(rootNode);    System.out.println("*******后序遍历(递归形式)*******");    binTree.postOrderTraverse(rootNode);    System.out.println("*******先序遍历(非递归形式)*******");    binTree.nrPreOrderTraverse(rootNode);    System.out.println("*******中序遍历(非递归形式)*******");    binTree.nrMiddleOrderTraverse(rootNode);    System.out.println("*******后序遍历(非递归形式)*******");    binTree.nrPostOrderTraverse(rootNode);    System.out.println("*******层次遍历(队列实现)*******");    binTree.levelTraverse(rootNode);    System.out.println("**********我是分割线**********");    System.out.println("该二叉树的高度为:" + binTree.getHeight());    System.out.println("该二叉树的size为:" + binTree.getSize());}

}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为麦芒6照相虚怎么办 荣耀8gps信号弱怎么办 华为麦芒4手机卡顿怎么办 华为麦芒4玩游戏卡怎么办 sim卡换卡通讯录丢了怎么办 换sim卡通讯录怎么办 麦芒4开不了机怎么办 麦芒5开不了机怎么办 麦芒6针丢了怎么办 麦芒6扬声器坏了怎么办 华为手机2s太卡怎么办 华为麦芒6网速慢怎么办 华为麦芒5太卡怎么办 小米note3拍照反应慢怎么办 华为刷机后还要账号密码怎么办 刷机后忘记华为账号和密码怎么办 荣耀7x耗电快怎么办 小米2s死机后怎么办? 电信合约卡不想用了怎么办 vivo合约机掉了怎么办 华为合约机丢了怎么办 两年合约机掉了怎么办 电信合约机丢了怎么办 s8合约机坏了怎么办 合约机的卡掉了怎么办 移动合约机屏幕碎了怎么办 5s用不了电信卡怎么办 vivo手机4g信号差怎么办 电信dns辅服务器未响应怎么办 笔记本wifi下载速度慢怎么办 苹果wifi下载速度慢怎么办 小米手机wifi下载速度慢怎么办 苹果8plus上网慢怎么办 小米5c死机了怎么办 苹果x自拍反方向怎么办 硅胶手机壳出油怎么办 指环扣松了怎么办图解 塑料放久了发粘怎么办 橡胶时间久了粘怎么办 胶的手机套变黄怎么办 手机壳硅胶变黄怎么办