二叉树的反向级别遍历


Question

给定一个二叉树,按照相反的顺序逐级打印其节点。 即最后一级存在的所有节点应首先打印,其次是第二级节点,依此类推。任何级别的所有节点都应从左到右打印。
例如,下面的树的级别遍历是4,5,2,3,1

    1
   / 
  2   3
 / 
4   5


Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class Node {
int data;
Node left, right;

Node(int item) {
data = item;
left = right = null;
}
}

public class BinaryTree {
Node root;

/* Function to print REVERSE level order traversal a tree */
public void reverseLevelOrder(Node node) {
int h = height(node);
int i;
for (i = h; i >= 1; i--)
// THE ONLY LINE DIFFERENT FROM NORMAL LEVEL ORDER
{
printGivenLevel(node, i);
}
}

/* Print nodes at a given level */
public void printGivenLevel(Node node, int level) {
if (node == null)
return;
if (level == 1)
System.out.print(node.data + " ");
else if (level > 1) {
printGivenLevel(node.left, level - 1);
printGivenLevel(node.right, level - 1);
}
}

/*
* Compute the "height" of a tree -- the number of nodes along the longest
* path from the root node down to the farthest leaf node.
*/
int height(Node node) {
if (node == null)
return 0;
else {
/* compute the height of each subtree */
int lheight = height(node.left);
int rheight = height(node.right);

/* use the larger one */
if (lheight > rheight)
return (lheight + 1);
else
return (rheight + 1);
}
}

// Driver program to test above functions
public static void main(String args[]) {

BinaryTree tree = new BinaryTree();

// Let us create trees shown in above diagram
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
tree.reverseLevelOrder(tree.root);


}
}