LeetCode - Medium - 145. Binary Tree Postorder Traversal

川长思鸟来 2022-12-27 12:41 250阅读 0赞

Topic

Stack, Tree

Description

https://leetcode.com/problems/binary-tree-postorder-traversal/

Given a binary tree, return the postorder traversal of its nodes’ values.

Example:

  1. Input: [1,null,2,3]
  2. 1
  3. \
  4. 2
  5. /
  6. 3

Output: [3,2,1]

Follow up: Recursive solution is trivial, could you do it iteratively?

Analysis

方法一:我写的非递归版(用栈实现)

方法二:别人写的非递归版(用栈实现)

方法三:传统的非递归版

Submission

  1. import java.util.ArrayList;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import java.util.Stack;
  5. import com.lun.util.BinaryTree.TreeNode;
  6. public class BinaryTreePostorderTraversal {
  7. //方法一:我写的非递归版
  8. public List<Integer> postorderTraversal(TreeNode root) {
  9. if(root == null) {
  10. throw new IllegalArgumentException();
  11. }
  12. List<Integer> result = new ArrayList<>();
  13. LinkedList<Object> stack = new LinkedList<>();
  14. TreeNode node = root;
  15. outter : while(true) {
  16. if(node.left != null && node.right != null) {
  17. stack.push(node);
  18. stack.push(2);
  19. node = node.left;
  20. }else if(node.left != null && node.right == null) {
  21. stack.push(node);
  22. stack.push(1);
  23. node = node.left;
  24. }else if(node.left == null && node.right != null) {
  25. stack.push(node);
  26. stack.push(1);
  27. node = node.right;
  28. }else {
  29. result.add(node.val);
  30. while(true) {
  31. if(stack.isEmpty()) {
  32. break outter;
  33. }
  34. int count = (int)stack.pop();
  35. if(count == 1) {
  36. TreeNode tmp = (TreeNode)stack.pop();
  37. result.add(tmp.val);
  38. }else if(count == 2) {
  39. stack.push(1);
  40. node = ((TreeNode)stack.get(1)).right;
  41. break;
  42. }
  43. }
  44. }
  45. }
  46. return result;
  47. }
  48. //方法二:别人写的非递归版
  49. public List<Integer> postorderTraversal2(TreeNode root) {
  50. LinkedList<Integer> ans = new LinkedList<>();
  51. Stack<TreeNode> stack = new Stack<>();
  52. if (root == null) return ans;
  53. stack.push(root);
  54. while (!stack.isEmpty()) {
  55. TreeNode cur = stack.pop();
  56. ans.addFirst(cur.val);
  57. if (cur.left != null) {
  58. stack.push(cur.left);
  59. }
  60. if (cur.right != null) {
  61. stack.push(cur.right);
  62. }
  63. }
  64. return ans;
  65. }
  66. //方法三:传统的递归版
  67. public List<Integer> postorderTraversal3(TreeNode root) {
  68. List<Integer> result = new ArrayList<>();
  69. postorderTraversal3(root, result);
  70. return result;
  71. }
  72. private void postorderTraversal3(TreeNode root, List<Integer> list) {
  73. if(root != null) {
  74. postorderTraversal3(root.left, list);
  75. postorderTraversal3(root.right, list);
  76. list.add(root.val);
  77. }
  78. }
  79. }

Test

  1. import static org.junit.Assert.*;
  2. import static org.hamcrest.CoreMatchers.*;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.stream.Collectors;
  6. import org.junit.Test;
  7. import com.lun.util.BinaryTree.TreeNode;
  8. public class BinaryTreePostorderTraversalTest {
  9. @Test
  10. public void test() {
  11. BinaryTreePostorderTraversal obj = new BinaryTreePostorderTraversal();
  12. TreeNode root = new TreeNode(1);
  13. root.right = new TreeNode(2);
  14. root.right.left = new TreeNode(3);
  15. List<Integer> actual = obj.postorderTraversal(root);
  16. List<Integer> actual2 = obj.postorderTraversal2(root);
  17. List<Integer> actual3 = obj.postorderTraversal3(root);
  18. assertThat(actual, is(Arrays.asList(3,2,1)));
  19. assertThat(actual2, is(Arrays.asList(3,2,1)));
  20. assertThat(actual3, is(Arrays.asList(3,2,1)));
  21. }
  22. @Test
  23. public void test2() {
  24. BinaryTreePostorderTraversal obj = new BinaryTreePostorderTraversal();
  25. //https://blog.csdn.net/qq_34840129/article/details/80619761中的图
  26. TreeNode root = new TreeNode('A');
  27. root.left = new TreeNode('B');
  28. root.right = new TreeNode('C');
  29. root.left.left = new TreeNode('D');
  30. root.left.right = new TreeNode('E');
  31. root.left.left.right = new TreeNode('H');
  32. root.left.right.right = new TreeNode('I');
  33. //---
  34. root.right.left = new TreeNode('F');
  35. root.right.right = new TreeNode('G');
  36. root.right.left.left = new TreeNode('J');
  37. root.right.left.right = new TreeNode('K');
  38. inorder(root);
  39. List<Integer> actual = obj.postorderTraversal(root);
  40. List<Integer> actual2 = obj.postorderTraversal2(root);
  41. List<Integer> actual3 = obj.postorderTraversal3(root);
  42. List<Integer> expect = Arrays.asList('H', 'D', 'I', 'E', 'B', 'J', 'K', 'F', 'G', 'C', 'A')
  43. .stream().map(a->a-'A').collect(Collectors.toList());
  44. assertThat(actual, is(expect));
  45. assertThat(actual2, is(expect));
  46. assertThat(actual3, is(expect));
  47. }
  48. private static void inorder(TreeNode node) {
  49. if(node != null) {
  50. inorder(node.left);
  51. node.val = node.val - 'A';
  52. inorder(node.right);
  53. }
  54. }
  55. }

发表评论

表情:
评论列表 (有 0 条评论,250人围观)

还没有评论,来说两句吧...

相关阅读