LeetCode 94. Binary Tree Inorder Traversal(二叉树的中序遍历)
2016-05-23 00:35
645 查看
原题网址:https://leetcode.com/problems/binary-tree-inorder-traversal/
Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree
return
Note: Recursive solution is trivial, could you do it iteratively?
confused what
read more on how binary tree is serialized on OJ.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
The above binary tree is serialized as
方法一:递归。
方法二:将方法一的递归之间修改为用栈实现。
方法三:通过prev来区分当前是正在向下遍历,还是已经遍历完成,以免重复压栈。
Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree
{1,#,2,3},
1 \ 2 / 3
return
[1,3,2].
Note: Recursive solution is trivial, could you do it iteratively?
confused what
"{1,#,2,3}"means? >
read more on how binary tree is serialized on OJ.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
1 / \ 2 3 / 4 \ 5
The above binary tree is serialized as
"{1,2,3,#,#,4,#,#,5}".
方法一:递归。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { private List<Integer> traversal = new ArrayList<>(); private void traverse(TreeNode root) { if (root == null) return; if (root.left != null) traverse(root.left); traversal.add(root.val); if (root.right != null) traverse(root.right); } public List<Integer> inorderTraversal(TreeNode root) { traverse(root); 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> inorderTraversal(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) { traversal.add(node.val); nodes.push(node); states.push(3); nodes.push(node.right); states.push(1); continue; } else { // nothing to do } } 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> inorderTraversal(TreeNode root) { List<Integer> traversal = new ArrayList<>(); if (root == null) return traversal; Stack<TreeNode> nodes = new Stack<>(); TreeNode prev = null; nodes.push(root); while (!nodes.isEmpty()) { TreeNode node = nodes.pop(); if (prev == null || node == prev.left || node == prev.right) { if (node.left != null && node.right != null) { nodes.push(node.right); nodes.push(node); nodes.push(node.left); } else if (node.left != null) { nodes.push(node); nodes.push(node.left); } else if (node.right != null) { traversal.add(node.val); nodes.push(node.right); } else { traversal.add(node.val); } } else { traversal.add(node.val); } prev = node; } return traversal; } }
相关文章推荐
- LeetCode 95. Unique Binary Search Trees II(唯一二叉搜索树)
- Maven生命周期解释
- lockInterruptibly 和lock的区别
- LeetCode 84. Largest Rectangle in Histogram(最大矩形)
- LeetCode 85. Maximal Rectangle(最大矩形)
- LeetCode 86. Partition List(链表分区)
- LeetCode 88. Merge Sorted Array(合并有序数组)
- LeetCode 87. Scramble String(字符串扰乱)
- LeetCode 89. Gray Code(格雷码)
- LeetCode 90. Subsets II(子集)
- LeetCode 92. Reverse Linked List II(翻转链表)
- LeetCode 93. Restore IP Addresses(恢复IP地址)
- 浅谈模板引擎
- fucknoodle
- threejs(三) 光源,材质,纹理
- vi 全选
- C# CodeFirst编程模型一
- SSD Win8 系统盘 4K 无损对齐历险记
- C语言:线索二叉树的线索化及其遍历实现
- Spring-data-redis: 事务与pipeline