LeetCode 94. Binary Tree Inorder Traversal(二叉树的中序遍历)
来源:互联网 发布:现在windows出到几了 编辑:程序博客网 时间:2024/05/17 22:27
原题网址: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 {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 \ 5The 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; }}
简化:
/** * 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> results = new ArrayList<>(); if (root == null) return results; ArrayDeque<TreeNode> stack = new ArrayDeque<>(); stack.push(root); TreeNode prev = null; while (!stack.isEmpty()) { TreeNode node = stack.pop(); if (prev == null || prev.left == node || prev.right == node) { if (node.right != null) stack.push(node.right); if (node.left != null) { stack.push(node); stack.push(node.left); } else { results.add(node.val); } } else { results.add(node.val); } prev = node; } return results; }}
0 0
- LeetCode 94. Binary Tree Inorder Traversal(二叉树的中序遍历)
- 94.LeetCode Binary Tree Inorder Traversal(medium)[中序遍历二叉树 树的遍历]
- LeetCode Binary Tree Inorder Traversal 中序遍历二叉树
- [LeetCode]94. Binary Tree Inorder Traversal--二叉树的中序遍历
- LeetCode | Binary Tree Inorder Traversal(二叉树的中序遍历)
- LeetCode OJ 之 Binary Tree Inorder Traversal (二叉树的中序遍历)
- Binary Tree Inorder Traversal 二叉树的中序遍历
- 二叉树的中序遍历 Binary Tree Inorder Traversal
- Binary Tree Inorder Traversal 二叉树的中序遍历
- LeetCode—***Binary Tree Inorder Traversal二叉树的中序遍历
- 【LeetCode】Binary Tree Inorder Traversal二叉树的中序遍历
- LeetCode 94 Binary Tree Inorder Traversal(二叉树的中序遍历)+(二叉树、迭代)
- LintCode Binary Tree Inorder Traversal 二叉树的中序遍历(非递归)
- Binary Tree Inorder Traversal 二叉树的中序遍历(迭代非递归版本)
- 67.Binary Tree Inorder Traversal-二叉树的中序遍历(容易题)
- 94. Binary Tree Inorder Traversal(中序遍历二叉树)
- LeetCode 94:Binary Tree Inorder Traversal(中序遍历)
- 【leetcode】94Binary Tree Inorder Traversal(非递归中序遍历二叉树)
- 多进程中的SharedPreferences
- 第102讲: 动手实战Spark Streaming自定义Receiver并进行调试和测试
- THUCTC源码解读(三)
- android异步消息机制,源码层面彻底解析(一)
- EM算法总结
- LeetCode 94. Binary Tree Inorder Traversal(二叉树的中序遍历)
- C++基础知识(三)—— 常量
- Android+ eclipse开发快捷键
- stm32资源
- 剑指offerJava实现 二维数组的查找
- MyBatis Review——输入输出映射
- Android经验之如何使用JDBC连接数据库
- Java-final修饰符
- 回调函数思想