LeetCode 145. Binary Tree Postorder Traversal(二叉树后序遍历)
2016-05-26 01:31
363 查看
原题网址:https://leetcode.com/problems/binary-tree-postorder-traversal/
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree
return
Note: Recursive solution is trivial, could you do it iteratively?
方法一:用栈模拟递归过程。
方法二:使用prev指针保存遍历顺序,只要能够区分目前是从上往下还是从下往上即可。
另一种更简洁的实现:
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?
方法一:用栈模拟递归过程。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> traversal = new ArrayList<>(); Stack<TreeNode> nodes = new Stack<>(); Stack<Integer> states = new Stack<>(); nodes.push(root); states.push(1); while (!nodes.isEmpty()) { TreeNode node = nodes.pop(); int state = states.pop(); if (node == null) continue; if (state == 1) { nodes.push(node); states.push(2); nodes.push(node.left); states.push(1); continue; } else if (state == 2) { nodes.push(node); states.push(3); nodes.push(node.right); states.push(1); continue; } else if (state == 3) { traversal.add(node.val); continue; } } return traversal; } }
方法二:使用prev指针保存遍历顺序,只要能够区分目前是从上往下还是从下往上即可。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> traversal = new ArrayList<>(); if (root == null) return traversal; Stack<TreeNode> nodes = new Stack<>(); nodes.push(root); TreeNode prev = null; while (!nodes.isEmpty()) { TreeNode node = nodes.pop(); if (prev == null || prev.left == node || (!nodes.isEmpty() && nodes.peek().left == prev && nodes.peek().right == node) || (!nodes.isEmpty() && nodes.peek().left == null && prev.right == node)) { nodes.push(node); if (node.right != null) nodes.push(node.right); if (node.left != null) nodes.push(node.left); } else { traversal.add(node.val); } prev = node; } return traversal; } }
另一种更简洁的实现:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); if (root == null) return result; Stack<TreeNode> stack = new Stack<>(); stack.push(root); TreeNode prev = null; while (!stack.isEmpty()) { TreeNode node = stack.pop(); if ((node.left == null && node.right == null) || (prev != null && (node.left == prev || node.right == prev))) { result.add(node.val); } else { stack.push(node); if (node.right != null) stack.push(node.right); if (node.left != null) stack.push(node.left); } prev = node; } return result; } }
相关文章推荐
- 关于在写5-3路上的一点趣事
- SVG path绘制百分比圆弧,给力啊
- windows下编译java源文件的编码错误
- VMware中linux访问共享文件夹设置流程
- TortoiseSVN与VisualSVN Server搭建SVN版本控制系统【转】
- 理解几个概念
- 9.2容器库概览
- LeetCode 146. LRU Cache(LRU缓存)
- cocos2dx笔试题
- 关于Fragment.onCreate()中引用Activity.onCreate()创建的对象时的一个异常
- hdu 3874 线段树 离线查询
- Java序列化与反序列化
- LeetCode 147. Insertion Sort List(插入有序链表)
- HDOJ/HDU 1073 Online Judge(字符串处理~)
- HDOJ/HDU 1073 Online Judge(字符串处理~)
- hdu 2852 线段树 单点更新
- Android N画中画模式
- LeetCode 148. Sort List(链表排序)
- win8.1安装软件报错-2503和2502
- iOS多线程编程及GCD简介