16.输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4261605.html

声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明。谢谢。

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。

题目分析:可以用一个LinkedList的数据结构模拟队列来完成此操作。传入树的根节点root。

  1.如果root为空则结束交换,否则root 入队。

  2.当队列不为空时进行如下操作:

    a.队首元素出队,交换队首元素节点的左右孩子。

    b.如果队首元素的左孩子不为空,左孩子节点入队;如果队首元素的右孩子不为空,右孩子节点进栈。

算法实现:

 1     //层序遍历,使用LinkedList数据结构来模拟队列
 2     private void levelOrder(Node root){
 3         if(root==null){
 4             System.out.println("\n二叉树为空!");
 5             return;
 6         }
 7         System.out.println("\n这是二叉排序树的层序遍历结果:");
 8         LinkedList<Node> queue = new LinkedList<Node>();
 9         queue.add(root);      //根节点先入队
10         while(queue.size()!=0){
11             Node node = queue.removeFirst();  //得到并删除队列的第一个节点
12             System.out.print(node.data+" ");
13             if(node.left!=null){   //该节点的左孩子入队
14                 queue.add(node.left);
15             }
16             if(node.right!=null){   //该节点的右孩子入队
17                 queue.add(node.right);
18             }
19         }
20         System.out.println();
21     }

java实现完整源码:

 1 package com.interview;
 2 
 3 import java.util.LinkedList;
 4 
 5 /**
 6  * 题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
 7  * @author wjh
 8  *
 9  */
10 public class _16LeverOrder {
11 
12     /**
13      * @param args
14      */
15     public static void main(String[] args) {
16         _16LeverOrder builder= new _16LeverOrder();
17         int[] a = {20,5,22,4,7,25,13,36,42,11,24};
18         Node root = null;
19         root = builder.buildTree(root, a); //1)创建二叉排序树
20         builder.levelOrder(root);
21     }
22 
23     //层序遍历,使用LinkedList数据结构来模拟队列
24     private void levelOrder(Node root){
25         if(root==null){
26             System.out.println("\n二叉树为空!");
27             return;
28         }
29         System.out.println("\n这是二叉排序树的层序遍历结果:");
30         LinkedList<Node> queue = new LinkedList<Node>();
31         queue.add(root);      //根节点先入队
32         while(queue.size()!=0){
33             Node node = queue.removeFirst();  //得到并删除队列的第一个节点
34             System.out.print(node.data+" ");
35             if(node.left!=null){   //该节点的左孩子入队
36                 queue.add(node.left);
37             }
38             if(node.right!=null){   //该节点的右孩子入队
39                 queue.add(node.right);
40             }
41         }
42         System.out.println();
43     }
44     
45     
46     //建二叉排序树
47     private Node buildTree(Node root, int[] data) {
48         int n = data.length;
49         System.out.println("建树过程(a<--b表示在a左边插入b;a-->b表示在a右边插入b):");
50         for (int i = 0; i < n; i++) {
51         root=insert(root, data[i]);
52         }
53         return root;
54      }
55                 
56     //一次插入节点
57     private Node insert(Node node, int data) {
58         if (node == null) {
59             node = new Node(data,null,null);
60             System.out.println(node.data);
61          }else{ 
62             if(data <= node.data) {
63                 System.out.print(node.data+"<--");//在root左边插入
64                 node.left = insert(node.left, data);
65              } else {
66                 System.out.print(node.data+"-->"); //在root右边插入
67                 node.right = insert(node.right, data);
68              }
69          }
70          return node;
71     }
72     
73     //创建一个树节点类
74     class Node {
75         public int data;
76         public Node left;  //指向左孩子的指针    
77         public Node right;  //指向右孩子的指针    
78         public Node() {
79             super();
80         }
81         public Node(int data, Node left, Node right) {
82             super();
83             this.data = data;
84             this.left = left;
85             this.right = right;
86         }
87     }
88 }
完整源码

运行结果:

建树过程(a<--b表示在a左边插入b;a-->b表示在a右边插入b):
20
20<--5
20-->22
20<--5<--4
20<--5-->7
20-->22-->25
20<--5-->7-->13
20-->22-->25-->36
20-->22-->25-->36-->42
20<--5-->7-->13<--11
20-->22-->25<--24

这是二叉排序树的层序遍历结果:
20 5 22 4 7 25 13 24 36 11 42

 

posted @ 2015-01-30 10:03  武则天大人  阅读(1234)  评论(0编辑  收藏  举报