给定一个二叉树,返回它的中序 遍历。
示例:
输入: \([1,null,2,3]\)
1
\
2
/
3
输出: \([1,3,2]\)
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
解法(递归)
经典的算法题,没什么可说的。
代码(递归)
/**
* 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<>();
mid(root, result);
return result;
}
private void mid(TreeNode root, List<Integer> result) {
if (root ==null) {
return;
}
//先递归左子树
mid(root.left,result);
//递归完成后加入本节点
result.add(root.val);
//再递归右子树
mid(root.right, result);
}
}
解法(迭代)
构建一个栈,只要有左子树就一直压栈,直到左子树为空,出栈后将结果加入到result,然后将当前指针指向当前节点的右子树,进行下一轮压栈处理。
代码(迭代)
/**
* 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<>();
Stack<TreeNode> stack = new Stack<>();
while (root != null || !stack.empty()) {
//左子树一直压栈
while(root != null) {
stack.push(root);
root = root.left;
}
//出栈
root = stack.pop();
result.add(root.val);
//切换到右子树进行下一轮
root = root.right;
}
return result;
}
}