zoukankan      html  css  js  c++  java
  • 反转二叉树 打印二叉树

    代码:

    package com.qhong;
    
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class Main {
        public static void main(String[] args)   {
            TreeNode root =new TreeNode(0);
            TreeNode left=new TreeNode(1);
            TreeNode right=new TreeNode(2);
            TreeNode left2=new TreeNode(3);
            TreeNode right2=new TreeNode(4);
            TreeNode left3=new TreeNode(5);
            TreeNode right3=new TreeNode(6);
           left.left=left2;
           left.right=right2;
           right.left=left3;
           //right.right=right3;
           root.left=left;
           root.right=right;
    
           Print.PrintTreeNode(root);
           Solution.invertTree(root);
            Print.PrintTreeNode(root);
        }
    }
    
    class TreeNode {
          int val;
          TreeNode left;
          TreeNode right;
    
          TreeNode(int x) {
              val = x;
          }
      }
    
    
    class Solution {
        public static TreeNode invertTree(TreeNode root) {
            if (root == null) {
                return null;
            }
            if (root.left != null) {
                invertTree(root.left);
            }
            if (root.right != null) {
                invertTree(root.right);
            }
            TreeNode temp = root.left;
            root.left = root.right;
            root.right = temp;
            return root;
        }
    }
    
    
    class Print{
        //打印TreeNode
        public static void PrintTreeNode(TreeNode root){
            ArrayList arrayList=PrintFromTopToBottom(root);
            printTree(arrayList,arrayList.size());
        }
        //转换TreeNode为ArrayList
        private static ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
    
            ArrayList<Integer> list = new ArrayList();
            if(root == null)
                return list;
    
            Queue<TreeNode> queue = new LinkedList();
            queue.offer(root);
    
            while(!queue.isEmpty()){
                TreeNode treeNode = queue.poll();
                list.add(treeNode.val);
                if(treeNode.left != null)
                    queue.offer(treeNode.left);
                if(treeNode.right != null)
                    queue.offer(treeNode.right);
            }
    
            return list;
        }
    
        //以树形打印ArrayList
        private static void printTree(ArrayList array,int len){
    
            int layers = (int)Math.floor(Math.log((double)len)/Math.log((double)2))+1;  //树的层数
            int maxWidth = (int)Math.pow(2,layers)-1;  //树的最大宽度
            int endSpacing = maxWidth;
            int spacing;
            int numberOfThisLayer;
            for(int i=1;i<=layers;i++){  //从第一层开始,逐层打印
                endSpacing = endSpacing/2;  //每层打印之前需要打印的空格数
                spacing = 2*endSpacing+1;  //元素之间应该打印的空格数
                numberOfThisLayer = (int)Math.pow(2, i-1);  //该层要打印的元素总数
    
                int j;
                for(j=0;j<endSpacing;j++){
                    System.out.print("  ");
                }
    
                int beginIndex = (int)Math.pow(2,i-1)-1;  //该层第一个元素对应的数组下标
                for(j=1;j<=numberOfThisLayer;j++){
                    System.out.print(array.get(beginIndex++)+"");
                    for(int k=0;k<spacing;k++){  //打印元素之间的空格
                        System.out.print("  ");
                    }
                    if(beginIndex == len){  //已打印到最后一个元素
                        break;
                    }
                }
    
                System.out.println();
            }
            System.out.println();
        }
    
    }
          0              
      1      2      
    3  4  5  
    
          0              
      2      1      
    5  4  3  

    解决方法二:使用栈来模拟递归过程

    class Solution {
        /**
         * 翻转二叉树
         * @param root 二叉树的根
         * @return
         */
        public  static  TreeNode invertTree(TreeNode root) {
            if (root == null) {
                return root;
            }
            Stack<TreeNode> stack = new Stack<TreeNode>();
            stack.push(root);
            while (!stack.isEmpty()) {
                TreeNode node = stack.peek();
                stack.pop();
                if (node.left != null) {
                    stack.push(node.left);
                }
                if (node.right != null) {
                    stack.push(node.right);
                }
                for(int i=0;i<stack.size();i++){
                    System.out.println(stack.elementAt(i).val);
                }
                System.out.println("=============");
                TreeNode temp = node.left;
                node.left = node.right;
                node.right = temp;
            }
            return root;
        }
    }
    0              
      1      2      
    3  4  5  6  
    
    1
    2
    =============
    1
    5
    6
    =============
    1
    5
    =============
    1
    =============
    3
    4
    =============
    3
    =============
    =============
          0              
      2      1      
    6  5  4  3  

    https://my.oschina.net/Tsybius2014/blog/614514

    http://www.cnblogs.com/wintersoft/p/4676124.html

    https://www.nowcoder.com/questionTerminal/bcffd7e8a0d4402c99773bed98690bb7

  • 相关阅读:
    OpenCL多次循环执行内核的一个简单样例
    Visual Studio2013的C语言编译器对C99标准的支持情况
    关于OpenCL中三重循环的执行次序
    jQuery判断复选框是否勾选
    JS动态增加删除UL节点LI
    Javascript玩转继承(三)
    Javascript玩转继承(二)
    Javascript玩转继承(一)
    js方法call和apply实例解析
    简单实用的php分页函数代码
  • 原文地址:https://www.cnblogs.com/hongdada/p/6464076.html
Copyright © 2011-2022 走看看