您的位置:首页 > 其它

二叉树分层Z字形遍历

2016-12-20 00:00 399 查看

原题

  Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between).
  For example:
  Given binary tree
{3,9,20,#,#,15,7}
,

3
/ \
9  20
/  \
15   7


return its zigzag level order traversal as:

[
[3],
[20,9],
[15,7]
]


题目大意

  给定一棵二叉树,从顶向下,进行Z字形分层遍历,即:如果本层是从左向右的,下层就是从右向左。

解题思路

  二叉树分层遍历进行改进,使用两个栈来进行。

代码实现

树结点类

public class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}


算法实现类

import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

public class Solution {

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new LinkedList<>();

if (root == null) {
return result;
}
// 遍历标志,0表示从左到右,1表示从右到左
int flag = 0;
TreeNode node;
// 记录每一层的元素
List<Integer> lay = new LinkedList<>();
// 双向队列,当作栈来使用,记录当前层待处理结点
Deque<TreeNode> stack = new LinkedList<>();
// 记录下一层待处理结点
Deque<TreeNode> nextStack = new LinkedList<>();

stack.add(root);

while (!stack.isEmpty()) {
// 删除栈顶元素
node = stack.removeLast();

// 结果入队
lay.add(node.val);

// 如果当前是从左到右遍历,按左子树右子树的顺序添加
if (flag == 0) {
if (node.left != null) {
nextStack.addLast(node.left);
}

if (node.right != null) {
nextStack.addLast(node.right);
}
}
// 如果当前是从右到左遍历,按右子树左子树的顺序添加
else {
if (node.right != null) {
nextStack.addLast(node.right);
}

if (node.left != null) {
nextStack.addLast(node.left);
}
}

// 当前层已经处理完了
if (stack.isEmpty()) {
Deque<TreeNode> temp = nextStack;
nextStack = stack;
stack = temp;

// 标记下一层处理的方向
flag = 1 - flag;
// 保存本层结果
result.add(lay);
// 创建新的链表处理下一层的结果
lay = new LinkedList<>();
}
}

return result;
}
}


解题思路:
这题和第102题解法类似,对102题的方法进行改造,使用两个Deque来实现,第一个Deque()实现本层的遍历,第二个Deque()实现下层节点的输入。

二,AC了的程序(采用Java程序)

import java.util.*;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x)
{
val=x;
}
}

public class Test2 {

List<List<Integer>> list=new ArrayList<List<Integer>>();  //leetcode 103
public List<List<Integer>> zigzagLevelOrder(TreeNode root)
{
if(root==null)
{
return list;
}

//LinkedList<TreeNode> queue=new LinkedList<TreeNode>();  //定义LinkedList类型

//queue.offer(root);  // 首先把根节点入队列

boolean temp1=false;  //temp1=false表示从左到右遍历,temp2=true表示从右到左遍历
Deque<TreeNode> queue=new LinkedList<TreeNode>();//Deque是双向队列,双向队列是指该队列两端的元素既能够入队,也能出队
Deque<TreeNode> nextqueue=new LinkedList<TreeNode>(); //记录下一层待处理结点

queue.add(root); //首先先把二叉树的根进入双端队列
List<Integer> templist=new LinkedList<Integer>();  //templist为临时的集;
while(!queue.isEmpty())  //该双端队列不为空的
{

TreeNode node=queue.removeLast();//删除
templist.add(node.val);  //把节点值加入到临时集

if(temp1==false)  //如果当前是从左到右遍历的,那么下一层要从左到右添加节点
{
if(node.left!=null)
{
nextqueue.addLast(node.left);
}
if(node.right!=null)
{
nextqueue.addLast(node.right);
}
}
else //当前是从右到左遍历的,那么下层就要从右到左添加节点的。
{
if(node.right!=null)
{
nextqueue.addLast(node.right);
}
if(node.left!=null)
{
nextqueue.addLast(node.left);
}

}

if(queue.isEmpty())  //如果当前这层已经变为空了
{
Deque<TreeNode> temp=nextqueue; //就把下一层节点复制给当前节点,下一层的Deque边为空的
nextqueue=queue; //下一层deque变为空的。
queue=temp;

temp1=(temp1==false)?true:false;

list.add(templist);
templist=new LinkedList<Integer>();

}

}

return list;

}

public static void main(String []args)
{
Test2 test=new Test2();

TreeNode root=new TreeNode(3);
TreeNode p2=new TreeNode(9);
TreeNode p3=new TreeNode(20);
TreeNode p4=new TreeNode(15);
TreeNode p5=new TreeNode(7);
TreeNode p6=new TreeNode(4);
TreeNode p7=new TreeNode(5);

root.left=p2;
root.right=p3;
p3.left=p4;
p3.right=p5;
p5.left=p6;
p5.right=p7;

/*
TreeNode root=new TreeNode(1);
TreeNode p2=new TreeNode(2);
TreeNode p3=new TreeNode(3);
TreeNode p4=new TreeNode(4);
TreeNode p5=new TreeNode(5);

root.left=p2;
root.right=p3;
p2.left=p4;
p3.right=p5;
*/

List<List<Integer>> list=test.zigzagLevelOrder(root);
Iterator<List<Integer>> it1=list.iterator();
while(it1.hasNext())
{
List<Integer> list2=it1.next();
Iterator<Integer> it2=list2.iterator();
while(it2.hasNext())
{
int data=it2.next();
System.out.print(data+" ");
}
System.out.println();
}

}
}


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

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

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

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: