好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

一篇文章教你如何用多种迭代写法实现二叉树遍历

思想

利用栈和队列都可以实现树的迭代遍历。递归的写法将这个遍历的过程交给系统的堆栈去实现了,所以思想都是一样的、无非就是插入值的时机不一样。利用栈的先进先出的特点,对于前序遍历、我们可以先将当前的值放进结果集中,表示的是根节点的值、然后将当前的节点加入到栈中、当前的节点等于自己的left、再次循环的时候、也会将left作为新的节点、直到节点为空、也就是走到了树的最左边、然后回退、也就是弹栈、、也可以认为回退的过程是从低向上的、具体就是让当前的节点等于栈弹出的right、继续重复上面的过程,也就实现了树的前序遍历、也就是bfs.后续遍历、中序遍历思想也是类似的。

实现

?

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

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

public List<Integer> preorderTraversal1(TreeNode root) {

     List<Integer> res = new ArrayList<>();

     Stack<TreeNode> stack = new Stack<>();

     while (!stack.isEmpty() || root != null ) {

         while (root != null ) {

             res.add(root.val);

             stack.add(root);

             root = root.left;

         }

         TreeNode cur = stack.pop();

         root = cur.right;

     }

     return res;

}

public List<Integer> preorderTraversal2(TreeNode root) {

     List<Integer> res = new ArrayList<>();

     Stack<TreeNode> stack = new Stack<>();

     while (!stack.isEmpty() || root != null ) {

         if (root != null ) {

             res.add(root.val);

             stack.add(root);

             root = root.left;

         } else {

             TreeNode cur = stack.pop();

             root = cur.right;

         }

     }

     return res;

}

public List<Integer> preorderTraversal3(TreeNode root) {

     List<Integer> res = new ArrayList<>();

     if (root == null ) return res;

     Stack<TreeNode> stack = new Stack<>();

     stack.push(root);

     while (!stack.isEmpty()) {

         TreeNode cur = stack.pop();

         res.add(cur.val);

         if (cur.right != null ) {

             stack.push(cur.right);

         }

         if (cur.left != null ) {

             stack.push(cur.left);

         }

     }

     return res;

}

public List<Integer> preorderTraversal4(TreeNode root) {

     List<Integer> res = new ArrayList<>();

     if (root == null ) {

         return res;

     }

     LinkedList<TreeNode> queue = new LinkedList<>();

     queue.add(root);

     while (!queue.isEmpty()) {

         root = queue.poll();

         res.add(root.val);

         if (root.right != null ) {

             queue.addFirst(root.right);

         }

         if (root.left != null ) {

             root = root.left;

             while (root != null ) {

                 res.add(root.val);

                 if (root.right != null ) {

                     queue.addFirst(root.right);

                 }

                 root = root.left;

             }

         }

     }

     return res;

}

public List<Integer> inorderTraversal1(TreeNode root) {

     List<Integer> res = new ArrayList<>();

     Stack<TreeNode> stack = new Stack<>();

     while (root != null || !stack.isEmpty()) {

         if (root != null ) {

             stack.add(root);

             root = root.left;

         } else {

             TreeNode cur = stack.pop();

             res.add(cur.val);

             root = cur.right;

         }

     }

     return res;

}

public List<Integer> inorderTraversal2(TreeNode root) {

     List<Integer> res = new ArrayList<>();

     Stack<TreeNode> stack = new Stack<>();

     while (root != null || !stack.isEmpty()) {

         while (root != null ) {

             stack.add(root);

             root = root.left;

         }

         TreeNode cur = stack.pop();

         res.add(cur.val);

         root = cur.right;

     }

     return res;

}

public List<Integer> postorderTraversal1(TreeNode root) {

     List<Integer> res = new ArrayList<>();

     if (root == null ) return res;

     Stack<TreeNode> stack = new Stack<>();

     stack.push(root);

     while (!stack.isEmpty()) {

         TreeNode cur = stack.pop();

         res.add(cur.val);

         if (cur.left != null ) {

             stack.push(cur.left);

         }

         if (cur.right != null ) {

             stack.push(cur.right);

         }

     }

     Collections.reverse(res);

     return res;

}

public List<Integer> postorderTraversal2(TreeNode root) {

     List<Integer> res = new ArrayList<>();

     Stack<TreeNode> stack = new Stack<>();

     while (!stack.isEmpty()) {

         while (root != null ) {

             res.add(root.val);

             stack.push(root);

             root = root.right;

         }

         TreeNode cur = stack.pop();

         root = cur.left;

     }

     Collections.reverse(res);

     return res;

}

public List<List<Integer>> levelOrder(TreeNode root) {

     List<List<Integer>> ret = new ArrayList<>();

     if (root == null ) return ret;

     Queue<TreeNode> queue = new LinkedList<>();

     queue.offer(root);

     while (!queue.isEmpty()){

         int size = queue.size();

         List<Integer> list = new ArrayList<>();

         while (size!= 0 ){

             TreeNode cur = queue.poll();

             list.add(cur.val);

             if (cur.left!= null ){

                 queue.offer(cur.left);

             }

             if (cur.right!= null ){

                 queue.offer(cur.right);

             }

             size --;

         }

         ret.add(list);

     }

     return ret;

}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注的更多内容!

原文链接:https://blog.csdn.net/qq_45859087/article/details/119141358

查看更多关于一篇文章教你如何用多种迭代写法实现二叉树遍历的详细内容...

  阅读:15次