题目
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入: root = [1,null,2,3]
输出: [1,3,2]
题解
方式一:递归
复杂度:O(n) 每个节点访问一次
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new LinkedList<>();
inorder(root, result);
return result;
}
public void inorder(TreeNode node, List<Integer> result) {
if (node == null) {
return;
}
// 左子树
inorder(node.left, result);
// 根节点
result.add(node.val);
// 右子树
inorder(node.right, result);
}
方式二:迭代
public List<Integer> inorderTraversal(TreeNode root) {
// 显式维护递归时的栈
Stack<TreeNode> stack = new Stack<>();
List<Integer> result = new LinkedList<>();
while (!stack.isEmpty() || root != null) {
// 将当前节点及其所有左节点压栈
while (root != null) {
stack.push(root);
root = root.left;
}
// 栈顶取出当前节点
root = stack.pop();
result.add(root.val);
// 处理当前节点的右节点,如果右节点是null,则下次处理的是当前节点的父节点
root = root.right;
}
return result;
}
总结
算法:递归、迭代