zoukankan      html  css  js  c++  java
  • java二叉树的实现

    package arithmetic;
    
    import java.util.Stack;
    
    public class BinaryTree <T>{
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            node root = new node(1,"A");
            BinaryTree bt = new BinaryTree();
            bt.createBinaryTree(root);
            System.out.println("************************根序遍(修改前)******************************");
            //bt.preOrderTraverse(root);
            bt.preOder(root);
            System.out.println("************************先根序遍(修改后)******************************");
            bt.insertChileftd(root, 6, 0, 9, "QQQQQQ");    //实现了结点的插入
            bt.preOder(root);
    
        };
        /**
         * 创建该树,也可以通过insertChileftd来进行创建
         * @param root
         */
        public void createBinaryTree(node root){
            node b = new node(2,"B");
            node c = new node(3,"C");
            node d = new node(4,"D");
            node e = new node(5,"E");
            node f = new node(6,"F");
            node g = new node(7,"G");
            
            root.left = b;
            root.r = c;
            b.left = d;
            b.r = e;
            e.left = f;
            e.r = g;
        }
        /**
         * @param root 根节点
         * @param p        插入结点的编号
         * @param leftr    需要插入的是左孩子还是右孩子
         * @param ID    插入结点的编号
         * @param valeftue    插入结点的值
         */
        public void insertChileftd(node root, int p,int leftr,int ID, T valeftue){
            Stack<node> s = new Stack<node>();
            node Node = root;        //根节点
            node point= null;        //所需寻找的结点
            
            //通过栈的先序遍历寻找出p结点
             while (Node != null || s.size() > 0){
                 while(Node != null){
                     s.push(Node);
                     if (Node.id == p){
                         point = Node;
                         break;
                     }
                     if (Node.id == ID) {
                         System.out.println("改标号已存在,请重新插入");
                         System.exit(0);
                     }
                     Node = Node.left;
                 }
                 Node = s.pop();
                 Node = Node.r;
            }
             //根据leftr的只判断需要插入左孩子还是右孩子 leftr=0 表示插入做孩子 leftr = 1表示差入有孩子
             if (leftr == 0){
                 //判断左孩子是否为空,为空只修改值不修改编号,当孩子为空时插入孩子结点,并编号和赋值
                 if (point.left != null) {
                     point.left.valeft = valeftue;
                 }
                 else {
                     node lefteftChileftd = new node(0,null);
                     point.left = lefteftChileftd;
                     lefteftChileftd.id = ID;
                     lefteftChileftd.valeft = valeftue;
                 }
             }
             
             else if (leftr == 1){
                 if (point.r != null){
                     point.r.valeft = valeftue;
                 }
                 else {
                     node rightChileftd = new node(0,null);
                     point.left = rightChileftd;
                     rightChileftd.id = ID;
                     rightChileftd.valeft = valeftue;
                 }
             }
                         
        }
        /**
         * 用递归实现先序遍历
         * @param Node
         */
        public void  preOrderTraverse(node Node){
            if (Node != null){
                System.out.println("结点为:"+Node.id+"     结点值为:"+Node.valeft+" 	 ");
                preOrderTraverse(Node.left);
                preOrderTraverse(Node.r);
            }    
        }
        
        /**
         * 非递归实现先序遍历
         */
        public void preOder(node Node){
            Stack<node> s = new Stack<node>();
             while (Node != null || s.size() > 0){
                 while(Node != null){
                     s.push(Node);
                     System.out.println("结点为:"+Node.id+"     结点值为:"+Node.valeft+" 	 ");
                     Node = Node.left;
                 }
                 Node = s.pop();
                 Node = Node.r;
            }
        }
    }
    /**
     * 二叉树的节点数据结构
     * @author yb
     * @param <T>
     */
    class node<T>{
        node left;
        node r;
        //id为结点的标识号,valeft为结点的值
        T valeft = null;
        int id = 0;
        
        public node(int ID,T s){
            this.valeft = s;
            this.id = ID;
            this.left = null;
            this.r = null;
        }
    }
    人真是奇怪,非得走到最后一步,是不会觉悟的。但是到了最后一步,又觉得太晚了。
  • 相关阅读:
    28图结构的类实现
    27图的拓扑排序
    26最短路径之Floyd算法
    25最短路径之Dijkstra算法
    24最小生成树之Prim算法
    23最小生成树之Kruskal算法
    22-1图的遍历的源代码
    22图的遍历
    21图结构的基本概念
    20树结构的类实现
  • 原文地址:https://www.cnblogs.com/boWatermelon/p/6429286.html
Copyright © 2011-2022 走看看