LeetCode OJ平台上Binary Tree Postorder Traversal题目用java堆栈实现

来源:互联网 发布:勇者斗恶龙8知乎 编辑:程序博客网 时间:2024/06/05 22:44

原始题目如下,意为后序遍历二叉树,不要用递归。

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

For example:
Given binary tree {1,#,2,3},

   1    \     2    /   3

return [3,2,1].

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


后序遍历略微复杂,有两种方法:1,使用额外堆栈,记录节点的右孩子是否访问过;2,将“前序遍历”(中、右、左),然后逆序输出即为后序遍历。两种方法源代码如下:

import java.util.ArrayDeque;import java.util.LinkedList;import java.util.List;public class Solution {public static List<Integer> postorderTraversal(TreeNode root){ArrayDeque<TreeNode> stack = new ArrayDeque<TreeNode>();List<Integer> a = new LinkedList<Integer>();List<Integer> b = new LinkedList<Integer>();TreeNode tmp = null;if(root == null){return a;}else{stack.add(root);while(!stack.isEmpty()){tmp = stack.removeLast();a.add(tmp.val);if(tmp.left != null)stack.add(tmp.left);if(tmp.right != null)stack.add(tmp.right); }for(int i = a.size()-1 ; i >= 0; i --)b.add(a.get(i));return b;}}}


import java.util.ArrayDeque;import java.util.LinkedList;import java.util.List;public class Solution {public static List<Integer> postorderTraversal(TreeNode root){ArrayDeque<TreeNode> stack = new ArrayDeque<TreeNode>();ArrayDeque<TreeNode> flag = new ArrayDeque<TreeNode>();//Node in this stack, its right child had been visitedList<Integer> a = new LinkedList<Integer>();TreeNode tmp = null;if(root == null){return a;}else{stack.add(root);while(stack.peekLast().left != null){stack.add(stack.peekLast().left);}while(!stack.isEmpty()){if(stack.peekLast().right == null){//tmp = stack.removeLast();a.add(tmp.val);}else if(!flag.isEmpty() && stack.peekLast().equals(flag.peekLast())){// its right child had been visitedtmp = stack.removeLast();a.add(tmp.val);flag.removeLast();}else{//it has right child and the right child had not been visitedtmp = stack.peekLast();stack.add(stack.peekLast().right);flag.add(tmp);tmp = stack.peekLast();while(tmp.left != null){stack.add(tmp.left);tmp = tmp.left;}}}return a;}}public static void main(String args[]){List<Integer> c = new LinkedList<Integer>();TreeNode p = new TreeNode(1);TreeNode p2 = new TreeNode(2);TreeNode p3 = new TreeNode(3);TreeNode p4 = new TreeNode(4);TreeNode p5 = new TreeNode(5);TreeNode p6 = new TreeNode(6);TreeNode p7 = new TreeNode(7);p.left = p2;p.right = p5;p2.left = p3;p2.right = p4;p3.left = null;p3.right = null;p4.left = null;p4.right = null;p5.left = null;p5.right = null;c = postorderTraversal(p);for(int i = 0; i < c.size(); i ++ ){System.out.println(c.get(i));}}}


0 0
原创粉丝点击