zoukankan      html  css  js  c++  java
  • 树的前、中、后序遍历

    import java.util.Stack;
    
    /**
     * @Author: 
     * @Date: 2018/9/28 11:36
     */
    
    public class TreeSort {
        public static void main(String[] args) {
            TreeNode level4_1 = new TreeNode(8,null,null);
            TreeNode level4_2 = new TreeNode(9,null,null);
            TreeNode level3_1 = new TreeNode(4,null,null);
            TreeNode level3_2 = new TreeNode(5,level4_1,level4_2);
            TreeNode level3_3 = new TreeNode(6,null,null);
            TreeNode level3_4 = new TreeNode(7,null,null);
            TreeNode level2_1 = new TreeNode(2,level3_1,level3_2);
            TreeNode level2_2 = new TreeNode(3,level3_3,level3_4);
            TreeNode root = new TreeNode(1,level2_1,level2_2);
            Stack<TreeNode> stack = new Stack();
            preOrderSort(stack,root.getLeft(),root,root.getRight());
            System.out.println("前-----------");
            while(stack.size()!=0) {
                System.out.println(stack.pop().getVal());
            }
            System.out.println("中-----------");
    
            midOrderSort(stack,root.getLeft(),root,root.getRight());
            while(stack.size()>0) {
                System.out.println(stack.pop().getVal());
            }
            System.out.println("后-----------");
            backOrderSort(stack,root.getLeft(),root,root.getRight());
            while(stack.size()!=0) {
                System.out.println(stack.pop().getVal());
            }
            System.out.println("深度-----------="+depthTree(root));
            System.out.println("宽度-----------="+widthTree(root));
    
        }
    
        private static int widthTree(TreeNode root) {
            Stack<TreeNode> cStack = new Stack<>();
            cStack.push(root);
            int maxWidth = cStack.size();
            while(true) {
                Stack<TreeNode> stack = new Stack<>();
                while(cStack.size()>0) {
                    TreeNode node = cStack.pop();
                    TreeNode nodeLeft = node.getLeft();
                    if(nodeLeft!=null) {
                        stack.push(nodeLeft);
                    }
                    TreeNode nodeRight = node.getRight();
                    if(nodeRight!=null) {
                        stack.push(nodeRight);
                    }
                }
                cStack = stack;
                maxWidth = Math.max(maxWidth,stack.size());
                if(stack.size()==0) {
                    break;
                }
            }
            return maxWidth;
        }
    
        private static int depthTree(TreeNode node) {
            if(node!=null) {
                if(node.getLeft()==null && node.getRight() ==null) {
                    return 1;
                }else {
                    int countLeft = 0;
                    if(node.getLeft()!=null) {
                        countLeft = depthTree(node.getLeft());
                    }
                    int countRight = 0;
                    if(node.getRight() !=null) {
                        countRight = depthTree(node.getRight());
                    }
                    return 1 + Math.max(countLeft,countRight);
                }
            }else {
                return 0;
            }
        }
    
        private static void backOrderSort(Stack<TreeNode> cStack,TreeNode leftNode,TreeNode node,TreeNode rightNode) {
            if(leftNode!=null) {
                if(leftNode.getLeft()==null) {
                    cStack.push(leftNode);
                }else {
                    backOrderSort(cStack,leftNode.getLeft(),leftNode,leftNode.getRight());
                }
            }
            if(rightNode!=null) {
                if(rightNode.getLeft()==null && rightNode.getRight()==null ) {
                    cStack.push(rightNode);
                }else {
                    backOrderSort(cStack,rightNode.getLeft(),rightNode,rightNode.getRight());
                }
            }
            cStack.push(node);
        }
    
        private static void midOrderSort(Stack<TreeNode> cStack,TreeNode leftNode,TreeNode node,TreeNode rightNode) {
            if(leftNode!=null) {
                if(leftNode.getLeft()==null) {
                    cStack.push(leftNode);
                }else {
                    midOrderSort(cStack,leftNode.getLeft(),leftNode,leftNode.getRight());
                }
            }
            cStack.push(node);
            if(rightNode!=null) {
                if(rightNode.getLeft()==null && rightNode.getRight()==null ) {
                    cStack.push(rightNode);
                }else {
                    midOrderSort(cStack,rightNode.getLeft(),rightNode,rightNode.getRight());
                }
            }
        }
    
        private static void preOrderSort(Stack<TreeNode> cStack,TreeNode leftNode,TreeNode node,TreeNode rightNode) {
            cStack.push(node);
            if(leftNode!=null) {
                if(leftNode.getLeft()==null) {
                    cStack.push(leftNode);
                }else {
                    preOrderSort(cStack,leftNode.getLeft(),leftNode,leftNode.getRight());
                }
            }
            if(rightNode!=null) {
                if(rightNode.getLeft()==null && rightNode.getRight()==null ) {
                    cStack.push(rightNode);
                }else {
                    preOrderSort(cStack,rightNode.getLeft(),rightNode,rightNode.getRight());
                }
            }
        }
    }
    
    class TreeNode{
        private int val;
        private TreeNode left;
        private TreeNode right;
        public TreeNode(int val,TreeNode left,TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    
        public int getVal() {
            return val;
        }
    
        public TreeNode getLeft() {
            return left;
        }
    
        public TreeNode getRight() {
            return right;
        }
    }
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    [FAQ] GitHub 开启二次验证之后,如何通过 https clone 项目 ?
    [FAQ] GoLand 需要手动开启代码补全吗 ?
    [FAQ] 夏玉米 按规则查询域名靠谱吗 ?
    [FAQ] Error: com.mysql.jdbc.Driver not loaded. :jdbc_driver_library
    [php-src] Php内核的有趣高频宏
    [php-src] Php扩展开发的琐碎注意点、细节
    [ELK] Docker 运行 Elastic Stack 支持 TLS 的两种简单方式
    [Contract] Solidity 生成随机数方案
    [MySQL] 导入数据库和表的两种方式
    [ELK] 生产环境中 Elasticsearch 的重要配置项
  • 原文地址:https://www.cnblogs.com/use-D/p/9721150.html
Copyright © 2011-2022 走看看