Description:
Given a binary tree, return the inorder traversal of its nodes’ values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,3,2]
Follow up:
Recursive solution is trivial, could you do it iteratively?
题意:返回一颗二叉树的中序遍历结果;
解法一(递归):遍历一个二叉树最简单的就是用递归来求解了;
/**
1. Definition for a binary tree node.
2. public class TreeNode {
3. int val;
4. TreeNode left;
5. TreeNode right;
6. TreeNode(int x) { val = x; }
7. }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new LinkedList<>();
if(root == null) return result;
traversal(root, result);
return result;
}
private void traversal(TreeNode root, List<Integer> result){
if(root.left == null && root.right == null){
result.add(root.val);
return;
}
if(root.left != null) traversal(root.left, result);
result.add(root.val);
if(root.right != null) traversal(root.right, result);
}
}
解法二(非递归):对于中序遍历的非递归算法的描述如下
1. 初始化一个空栈nodes,实例化一个TreeNode对象p指向根结点;
2. 当p非空或者栈nodes非空时,循环执行以下的操作:
- if(p != null),则将p进栈,并且p指向其左节点
- if(p == null), 则弹出栈顶的元素,并访问此节点,再将p指向其右节点
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new LinkedList<>();
if(root == null){
return result;
}
Stack<TreeNode> nodes = new Stack<>();
TreeNode p = root;
while(!nodes.empty() || p != null){
if(p != null){
nodes.push(p);
p = p.left;
}
else{
TreeNode q = nodes.pop();
result.add(q.val);
p = q.right;
}
}
return result;
}
}