非递归遍历二叉树Java实现

java

题目:

要求使用非递归的方法,中序遍历二叉树

 

解答:

 

前序遍历

可以使用一个栈来模拟这种操作:

首先将root压栈;

每次从堆栈中弹出栈顶元素,表示当前访问的元素,对其进行打印;

依次判断其右子树,左子树是否非空,并进行压栈操作,至于为什么先压栈右子树,因为先压栈的后弹出,左子树需要先访问,因此后压栈;

中序遍历和后序遍历复杂一些。

  1 public class Solution {

2

3 // 非递归前序遍历

4 public List<Integer> preorderTraversal(TreeNode root) {

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

6 if(root == null) {

7 return res;

8 }

9

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

11 stack.push(root);

12

13 while(!stack.isEmpty()) {

14 TreeNode current = stack.pop();

15 res.add(current.val);

16

17 if(current.right != null) {

18 stack.push(current.right);

19 }

20

21 if(current.left != null) {

22 stack.push(current.left);

23 }

24 }

25

26 return res;

27 }

28

29 // 非递归中序遍历

30 public List<Integer> inorderTraversal(TreeNode root) {

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

32 IF(root == null) {

33 return res;

34 }

35

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

37

38 TreeNode p = root;

39 while(p != null || !stack.isEmpty()) {

40 if(p != null) {

41 stack.push(p);

42 p = p.left;

43 } else {

44 p = stack.pop();

45 res.add(p.val);

46 p = p.right;

47 }

48 }

49

50 return res;

51 }

52

53 // 非递归后序遍历

54 public List<Integer> postorderTraversal(TreeNode root) {

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

56 if(root == null) {

57 return res;

58 }

59

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

61

62 TreeNode p = root;

63

64 // 标记最近出栈的节点,用于判断是否是p节点的右孩子,如果是的话,就可以访问p节点

65 TreeNode pre = p;

66

67 while(p != null || !stack.isEmpty()) {

68 if(p != null) {

69

70 stack.push(p);

71 p = p.left;

72

73 } else {

74 p = stack.pop();

75

76 if(p.right == null || p.right == pre) {

77 res.add(p.val);

78 pre = cur;

79 p = null;

80 } else {

81 stack.push(p);

82 p = p.right;

83 stack.push(p);

84 p = p.left;

85 }

86 }

87 }

88

89 return res;

90 }

91

92 // 非递归层次遍历

93 public List<Integer> levelTraversal(TreeNode root) {

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

95 if(root == null) {

96 return res;

97 }

98

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

100

101 q.add(root);

102

103 while(!queue.isEmpty()) {

104 // current node

105 TreeNode current = queue.remove();

106 res.add(current.val);

107

108 if(current.left != null) {

109 queue.add(current.left);

110 }

111

112 if(current.right != null) {

113 queue.add(current.right);

114 }

115 }

116

117 return res;

118 }

119

120

121 }

 

以上是 非递归遍历二叉树Java实现 的全部内容, 来源链接: utcz.com/z/392198.html

回到顶部