Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 \ 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
题目链接:https://leetcode.com/problems/binary-tree-inorder-traversal/
题目分析:中序遍历二叉树,递归的方法简单明了,不多说了
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
void DFS(TreeNode root, List<Integer> ans) {
if(root == null) {
return;
}
DFS(root.left, ans);
ans.add(root.val);
DFS(root.right, ans);
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
DFS(root, ans);
return ans;
}
}
下面是非递归的做法,用一个栈模拟递归的过程,中序遍历的顺序是 左->中->右,先一直走到最左端,取值后pop,这个过程其实完成了左->中的遍历,每次pop后再往右走,这样就完成了左->中->右的遍历
/**
* 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> ans = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while(root != null || !stack.empty()) {
while(root != null) {
stack.push(root);
root = root.left;
}
if(!stack.empty()) {
root = stack.peek();
stack.pop();
ans.add(root.val);
root = root.right;
}
}
return ans;
}
}