94.二叉树的中序遍历
思路1(递归):
对二叉树进行 左节点,根节点,右节点进行遍历
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
inorderTraversal(root, list);
return list;
}
public void inorderTraversal(TreeNode root, List<Integer> list) {
if (root == null) return;
inorderTraversal(root.left, list);
list.add(root.val);
inorderTraversal(root.right, list);
}
}
思路2(迭代):
- 使用 链表 和 栈 进行迭代
- 先遍历左节点入栈并找到最后一个左节点,考虑到 倒数第二个左节点 是一个根节点, 并且 倒数第二个左节点 的左节点已出栈过,则将 倒数第二个左节点 的右节点入栈,依此流程得出迭代
- 考虑到 为空 的情况
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
Stack<TreeNode> stack = new Stack<>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
list.add(root.val);
root = root.right;
}
return list;
}
}