• 二叉树的基本功能和遍历(非递归)


    /**
     * 定义二叉树节点
     * @author TMAC-J
     *
     */
    public class Node {
        
        private Node parent;
        
        private Node leftSonNode;
        
        private Node rightSonNode;
        
        private Object data;
        
        private BinaryTree binaryTree;
        
        public Node() {}
        
        public Node(BinaryTree binaryTree){
            this.binaryTree = binaryTree;
        }
        
        public Node(Object data, BinaryTree binaryTree) {
            this.data = data;
            this.binaryTree = binaryTree;
        }
    
        public Node(Node parent,Node leftSonNode,Node rightSonNode,Object data) {
            this.parent = parent;
            this.leftSonNode = leftSonNode;
            this.rightSonNode = rightSonNode;
            this.data = data;
        }
        
        public Node getParent() {
            return parent;
        }
    
        public void setParent(Node parent) {
            binaryTree.setSize(binaryTree.getSize()+1);
            this.parent = parent;
        }
    
        public Node getLeftSonNode() {
            return leftSonNode;
        }
    
        public void setLeftSonNode(Node leftSonNode) {
            binaryTree.setSize(binaryTree.getSize()+1);
            this.leftSonNode = leftSonNode;
        }
    
        public Node getRightSonNode() {
            return rightSonNode;
        }
    
        public void setRightSonNode(Node rightSonNode) {
            binaryTree.setSize(binaryTree.getSize()+1);
            this.rightSonNode = rightSonNode;
        }
    
        public Object getData() {
            return data;
        }
    
        public void setData(Object data) {
            this.data = data;
        }
        
        public BinaryTree getBinaryTree() {
            return binaryTree;
        }
    
        public void setBinaryTree(BinaryTree binaryTree) {
            this.binaryTree = binaryTree;
        }
    }
    
    
    /**
     * @Description 这是一个数组实现的栈
     * @author TMAC-J
     *
     */
    public class Stack {
        /**
         * 储存元素的数组
         */
        private Object[] array = null;
        /**
         * 定义数组大小
         */
        private int size = 0;
        /**
         * 定义当前数组大小
         */
        private int currentSize = 0;
        /**
         * 定义指针
         */
        private int point = -1;
        /**
         * 构造方法
         */
        public Stack(int size){
            this.size = size;
            array = new Object[size];
        }
        /**
         * 入栈
         */
        public void push(Object data){
            if(isFull()){
                System.out.println("当前栈已满!");
                return;
            }
            point++;//指针上移
            array[point] = data;
            currentSize++;
            System.out.println("入栈");
        }
        /**
         * 出栈
         */
        public void pop(){
            if(isEmpty()){
                System.out.println("当前栈为空!");
                return;
            }
            array[point] = null;
            point--;//指针下移
            currentSize--;
            System.out.println("出栈");
        }
        /**
         * 判断是否为满
         */
        public boolean isFull(){
            if(currentSize>=size)return true;
            return false;
        }
        /**
         * 判断是否为空
         */
        public boolean isEmpty(){
            if(currentSize<=0)return true;
            return false;
        }
        
        public Object getStackTop(){
            return array[point];
        }
    }
    
    
    
    
    /**
     * 二叉树(我觉得一个实体类应当仅仅充当一个储存数据的bean,也就是说仅仅有set和get方法,而把其他操作抽象出去)
     * @author TMAC-J
     *
     */
    public class BinaryTree {
        
        private Node root;
        
        private int size;
        
        private int depth;
        
        public BinaryTree(Node root) {
            this.root = root;
        }
        
        public Node getRoot() {
            return root;
        }
    
        public void setRoot(Node root) {
            this.root = root;
        }
    
        public int getSize() {
            return size;
        }
    
        public void setSize(int size) {
            this.size = size;
        }
    
        public int getDepth() {
            return depth;
        }
    
        public void setDepth(int depth) {
            this.depth = depth;
        }
        
    
    }
    
    
    
    
    /**
     * 管理器一般用单例
     * @author TMAC-J
     *
     */
    public class BinaryTreeHelper {
        
        private static BinaryTreeHelper instance;
        
        private int depth;
        
        private BinaryTreeHelper(){}
        
        public static BinaryTreeHelper getInstance(){
            if(instance == null){
                synchronized (BinaryTreeHelper.class) {
                    if(instance == null){
                        instance = new BinaryTreeHelper();
                    }
                }
            }
            return instance;
        }
             /*        A
                     B   C
                   D  E F  G
                   
                   pre:ABDECFG*/
        /**
         * dfs(深度优先遍历,等同于先序遍历,非递归形式)
         */
        public void dfs(BinaryTree binaryTree,Stack stack){
            if(binaryTree!=null){
                stack.push(binaryTree.getRoot());
                while(!stack.isEmpty()){
                    Node node = (Node)stack.getStackTop();
                    System.out.println((String)((Node)stack.getStackTop()).getData());
                    stack.pop();
                    if(node.getRightSonNode()!=null){
                        stack.push(node.getRightSonNode());
                    }
                    if(node.getLeftSonNode()!=null){
                        stack.push(node.getLeftSonNode());
                    }
                }
            }
        }
         /* * A B C D E F G * * DBEAFCG */ /** * 中序遍历(inorder traversal) */ public void inorderTraversal(BinaryTree binaryTree, Stack stack) { if (binaryTree != null) { Node root = binaryTree.getRoot(); while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root);// 先访问再入栈 root = root.getLeftSonNode(); } root = (Node) stack.getStackTop(); stack.pop(); System.out.println((String) root.getData()); root = root.getRightSonNode();// 如果是null,出栈并处理右子树 } } } /* * A B C D E F G * * DEBFGCA */ /** * 后序遍历(postorder traversal) 后序遍历不同于先序和中序,它是要先处理完左右子树,然后再处理根(回溯), * 所以需要一个记录哪些节点已经被访问的结构(可以在树结构里面加一个标记),这里可以用map实现 * 思路是先让左右出栈,最后在根出栈,然后回到上一层继续循环(因为栈中有上一层的结点) */ public void postorderTraversal(BinaryTree binaryTree, Stack stack) { if (binaryTree != null) { Node root = binaryTree.getRoot(); Map<Node, Boolean> map = new HashMap<Node, Boolean>(); stack.push(root); while (!stack.isEmpty()) { Node temp = (Node) stack.getStackTop(); if (temp.getLeftSonNode() != null && !map.containsKey(temp.getLeftSonNode())) { temp = temp.getLeftSonNode(); while (temp != null) { if (map.containsKey(temp)) break; else stack.push(temp); temp = temp.getLeftSonNode(); } continue; } if (temp.getRightSonNode() != null && !map.containsKey(temp.getRightSonNode())) { stack.push(temp.getRightSonNode()); continue; } Node t = (Node) stack.getStackTop(); stack.pop(); map.put(t, true); System.out.println(t.getData()); } } }



    /* A B C D E F G ABCDEFG*/ /** * bfs(广度优先遍历) */ public void bfs(BinaryTree binaryTree,Queun queun){ if(binaryTree!=null){ queun.write(binaryTree.getRoot()); while(!queun.isEmpty()){ Node node = queun.getQueunHead(); System.out.println((String)node.getData()); queun.read(); if(node.getLeftSonNode()!=null){ queun.write(node.getLeftSonNode()); } if(node.getRightSonNode()!=null){ queun.write(node.getRightSonNode()); } } } } /** * 递归创建子树 */ public void createSonNode(Node parent,BinaryTree binaryTree){ Node leftSonNode = new Node(binaryTree); Node rightSonNode = new Node(binaryTree); parent.setLeftSonNode(leftSonNode); parent.setRightSonNode(rightSonNode); depth--; if(depth>1){ createSonNode(leftSonNode,binaryTree); createSonNode(rightSonNode,binaryTree); } } /** * 创建满二叉树 * @param depth,binaryTree * @return binaryTree */ public BinaryTree createFullBinaryTree(BinaryTree binaryTree,int depth){ this.depth = depth; Node root = binaryTree.getRoot(); createSonNode(root,binaryTree); return binaryTree; } } /** * @Decription 环形队列 * @author TMAC-J * */ public class Queun { /** * 初始化队列尺寸 */ private int queunSize = 0; /** * 初始化头指针 */ private int front = -1; /** * 初始化尾指针 */ private int rear = 0; /** * 声明数组 */ private Node[] array; /** * 当前大小 */ private int curentSize = 0; /** * 构造方法 * @param queunSize */ public Queun(int queunSize){ this.queunSize = queunSize; array = new Node[this.queunSize]; } /** * 读操作 */ public synchronized void read(){ if(!isEmpty()){ front = (front+1)%queunSize; array[front] = null; curentSize--; } else{ System.out.println("当前队列为空!"); /** * 优化CPU时间片的利用率,若当前队列为空会切换到另外的线程,不会继续执行此线程浪费时间和空间 */ try { this.notifyAll();//唤醒其他所有线程 this.wait();//释放对象锁,将当前线程置为阻塞 this.notify();//唤醒当前线程 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("front"+front); } /** * 写操作 * @param data */ public synchronized void write(Node data){ if(!isFull()){ array[rear] = data; rear = (rear+1)%queunSize; curentSize++; } else{ System.out.println("当前队列已满"); try { this.notifyAll(); this.wait(); this.notify(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("rear"+rear); } /** * 判断是否是满 */ public boolean isFull(){ if(curentSize == queunSize){ return true; } else{ return false; } } /** * 判断是否是空 */ public boolean isEmpty(){ if(curentSize == 0){ return true; } else{ return false; } } public Node getQueunHead(){ return array[(front+1)%queunSize]; } } public class Test { public static void main(String[] args) { BinaryTree binaryTree = new BinaryTree(null); Node root = new Node("A",binaryTree); /*Node b = new Node("B",binaryTree); Node c = new Node("C",binaryTree); Node d = new Node("D",binaryTree); Node e = new Node("E",binaryTree); Node f = new Node("F",binaryTree); Node g = new Node("G",binaryTree); binaryTree.setRoot(root); root.setLeftSonNode(b); root.setRightSonNode(c); b.setLeftSonNode(d); b.setRightSonNode(e); c.setLeftSonNode(f); c.setRightSonNode(g); BinaryTreeHelper binaryTreeHelper = BinaryTreeHelper.getInstance(); binaryTreeHelper.bfs(binaryTree, new Queun(10));*/ binaryTree.setRoot(root); BinaryTreeHelper binaryTreeHelper = BinaryTreeHelper.getInstance(); binaryTreeHelper.createFullBinaryTree(binaryTree, 3); } }

    以上就是二叉树相关

  • 相关阅读:
    java web前端发送请求的4种方式
    简单的jQuery前端验证码校验
    验证码实现原理
    Objective-C的内存管理(一)黄金法则的理解
    UIview层次管理
    IOS设置图片背景
    Google Code Jam 2014 Round 1 A:Problem C. Proper Shuffle
    Google Code Jam 2014 Round 1 A:Problem B. Full Binary Tree
    Google Code Jam 2014 Round 1 A:Problem A Charging Chaos
    UVA 10209
  • 原文地址:https://www.cnblogs.com/yzjT-mac/p/6249359.html
Copyright © 2020-2023  润新知