zoukankan      html  css  js  c++  java
  • 按层打印二叉树

    二叉树的遍历,无非就是按层遍历,先序遍历,中序遍历和后序遍历这几种。其中后三种的先,中,后等等是相对于根节点而言的。给出一棵二叉树,我们可以按照相对应的规则去输出它的遍历序列,同样的,如果满足一定的条件,那么也可以通过给出的序列来还原相对应的二叉树。

    以满二叉树为例,如下图:(略丑,将就看看)

    这棵二叉树的中序遍历为:D -> B -> E -> A -> F -> C -> G

    可以发现对于每棵子树,根节点肯定是在中间的位置,而左右孩子则分居左右。通过这个规律,我们可以通过给出的中序遍历序列,来还原这一棵二叉树:

    以上述序列为例,先求序列中点,则可确定根节点;然后不断分割成左右子树,继续做相同的工作,则可不断求出每棵子树的根节点,一直到叶子为止。可通过把每次求出来的“根”节点加入到队列之中,来保证还原该二叉树时的节点顺序。

    import java.util.Scanner;
    
    public class printBinaryTree {
        static class Tree{
            int left;
            int right;
            int idx;
            int val;
        }
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int K = in.nextInt();   //the level of tree(<=10)
            int[] counts = {0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023};
            int[] nodes = new int[counts[K]]; //inorder traversal
            boolean[] visited = new boolean[counts[K]]; 
            for(int i = 0; i < counts[K]; i++) {
                nodes[i] = in.nextInt();
            }
            for(int j = 0; j < counts[K]; j++) {
                visited[j] = false;
            }
            operate(nodes, counts, visited, K);
            
        }
        
        public static void operate(int[] nodes, int[] counts, boolean[] visited, int k) {
            Tree root = new Tree();
            int mid = counts[k]/2;
            root.idx = mid;
            root.left = 0;
            root.right = counts[k]-1;
            root.val = nodes[mid];
            visited[mid] = true;
            Tree[] queue = new Tree[counts[k]];  
            int head = 0; //the head of the queue
            int tail = 0; //the tail of the queue
            queue[tail++] = root;  // enter the queue
            int times = 0; 
            int target = 1;
            while(head < tail) {
                Tree t = queue[head++];
                //print the tree by level
                System.out.print(t.val+ " ");
                times++;
                if(times == target) {
                    System.out.println();
                    times = 0;
                    target *= 2;
                }
                //add left child
                Tree leftChild = new Tree();
                leftChild.left = t.left;
                leftChild.right = t.idx-1;
                leftChild.idx = (leftChild.left+leftChild.right)/2;
                leftChild.val = nodes[leftChild.idx];
                if(!visited[leftChild.idx]) {
                    visited[leftChild.idx] = true;
                    queue[tail++] = leftChild;
                }
                //add right child
                Tree rightChild = new Tree();
                rightChild.left = t.idx+1;
                rightChild.right = t.right;
                rightChild.idx = (rightChild.left+rightChild.right)/2;
                rightChild.val = nodes[rightChild.idx];
                if(!visited[rightChild.idx]) {
                    visited[rightChild.idx] = true;
                    queue[tail++] = rightChild;
                }
            }
            
        }
    
    }
  • 相关阅读:
    开心网注册详解和邀请码发放
    3COM 905TX 配置
    SQL使用
    JDBC的使用
    kiko日记几个月以来工作总结2010 1124
    talk about the history of JAZZ
    这几个月的工作任务
    工作间期的不足
    转: mac使用nvm管理多个版本node
    负载均衡与ssl证书
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/12520914.html
Copyright © 2011-2022 走看看