LeetCode94 Binary Tree Inorder Traversal(迭代实现) Java
题目:
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].
分析:
中根遍历二叉树,也就是说,对树中的不论什么一个节点,先訪问其左子树,再訪问根节点,最后訪问其右子树。通过迭代的方式实现中根遍历二叉树,须要借助栈。
在遍历二叉树前,须要做点准备工作:包装每个树节点。包装后的节点中。除了树节点本身。还有还有一个域,用于指示这个节点的左子树是否已经被訪问过了。
算法的详细过程是这种:
(1)把根节点入栈
(2)进入循环。循环中是这种,当栈非空时,看看栈顶节点的左孩子是否存在,假设存在且没有被訪问过。就把它的左孩子入栈,否则,就把该节点弹栈,訪问该节点,并看看它的右孩子是否存在。假设存在,就把它的右孩子入栈。
详细代码例如以下:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> resultList = new ArrayList<Integer>();
if (root == null) {
return resultList;
}
LinkedList<TreeNodeWithFlag> stack = new LinkedList<>();
stack.push(new TreeNodeWithFlag(root, false));
while (!stack.isEmpty()) {
TreeNodeWithFlag temp = stack.peek();
if (temp.getTreeNode().left != null && !temp.flag) {
stack.push(new TreeNodeWithFlag(temp.getTreeNode().left, false));
// 当temp再次处于栈顶时。它的左子树必然已经被訪问过了
temp.setFlag(true);
} else {
resultList.add(temp.getTreeNode().val);
stack.pop();
if (temp.getTreeNode().right != null) {
stack.push(new TreeNodeWithFlag(temp.getTreeNode().right, false));
}
}
}
return resultList;
}
private static class TreeNodeWithFlag {
private TreeNode treeNode;
// 表示该节点的左子树是否被訪问过
private boolean flag;
private TreeNodeWithFlag(TreeNode treeNode, boolean flag) {
super();
this.treeNode = treeNode;
this.flag = flag;
}
public TreeNode getTreeNode() {
return treeNode;
}
public void setTreeNode(TreeNode treeNode) {
this.treeNode = treeNode;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public String toString() {
return "TreeNodeWithFlag [treeNode=" + treeNode + ", flag=" + flag
+ "]";
}
}
LeetCode94 Binary Tree Inorder Traversal(迭代实现) Java的更多相关文章
- (二叉树 递归) leetcode94. Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...
- LeetCode94. Binary Tree Inorder Traversal
题目 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 考点 stack ...
- Leetcode94. Binary Tree Inorder Traversal二叉树的中序遍历(两种算法)
给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 递归: class So ...
- LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)
94. 二叉树的中序遍历 94. Binary Tree Inorder Traversal 题目描述 给定一个二叉树,返回它的 中序 遍历. LeetCode94. Binary Tree Inor ...
- [leetcode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历
题目大意 https://leetcode.com/problems/binary-tree-inorder-traversal/description/ 94. Binary Tree Inorde ...
- 61. Binary Tree Inorder Traversal
Binary Tree Inorder Traversal My Submissions QuestionEditorial Solution Total Accepted: 123484 Total ...
- LintCode Binary Tree Inorder Traversal
Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...
- 37. Binary Tree Zigzag Level Order Traversal && Binary Tree Inorder Traversal
Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...
- 3月3日(4) Binary Tree Inorder Traversal
原题: Binary Tree Inorder Traversal 和 3月3日(2) Binary Tree Preorder Traversal 类似,只不过变成中序遍历,把前序遍历的代码拿出来, ...
随机推荐
- 未知高度的图片在div设置垂直居中
方法一: 该方法是将外部容器的显示模式设置成display:table,img标签外部再嵌套一个span标签,并设置span的显示模式为display:table-cell,这样就可以很方便的使用ve ...
- 理解 CSS 的 z-index 属性
通常认为HTML页面是二维的,但实际上,CSS还有一个z-index属性,允许层叠元素. 所有的盒模型元素都处于三维坐标系中. 除了我们常用的横坐标和纵坐标, 盒模型元素还可以沿着“z轴”层叠摆放, ...
- 对 C# 未来的期望
接触 C# 一年,总体上是一个非常完善的语言,但是某些细节特征还是不够完美.这里记下我现在对它将来的一些期望. 更强大的泛型约束 与 C++ 的模板相似,C# 的泛型使得编写适用于多种 ...
- [Algorithm] Largest sum of non-adjacent numbers
Given a list of integers, write a function that returns the largest sum of non-adjacent numbers. Num ...
- [Javascript] Hositing
First, memory is set aside for all necessary variables and declared functions. Function expression n ...
- 部署项目Nginx+Tornado+Supervisor
http://www.jianshu.com/p/9bebb99368ea Tornado Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻 ...
- 整理两个PetaPoco连接SQLite数据库的方法
从https://github.com/qingask/PetaPoco.NetCore下载源文件压缩包 解压出文件PetaPoco.Multiple.cs.PetaPoco.NetCore.cs 放 ...
- Android实现Material Design风格的设置页面(滑动开关控件)
前言 本文链接 http://blog.csdn.net/never_cxb/article/details/50763271 转载请注明出处 參考了这篇文章 Material Design 风格的设 ...
- 修改字段结构之GP工具
即然有这个需求,就有人这样做.有人写了GP工具直接来重命名字段名和字段别名.工具及源码下载链接为:http://www.t00y.com/file/90123888 加载到ToolBox中后,可直接运 ...
- #define中的“#”和“##”的作用
在#define中,标准只定义了#和##两种操作: #用来把参数转换成字符串: ##则用来连接两个前后两个参数,把它们变成一个字符串.