题目:
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
方法一
思路:
递归
代码如下:
List<Integer> res = new ArrayList<>();
/**
* 二叉树的中序遍历
* @param root
* @return
*/
public List<Integer> inorderTraversal (TreeNode root) {
if (root != null) {
helper (root);
}
return res;
}
/**
* 辅助函数
* @param root
*/
public void helper (TreeNode root) {
if (root.left != null) {
helper (root.left);
}
res.add(root.val);
if (root.right != null) {
helper (root.right);
}
}
方法二
思路:
迭代
通过借助数据结构,通常选择栈。今天我发现这道题用链表也可以,而且用时可以超过100%的用户。前者只能超过一半。
具体原理我还不清楚,留个坑。
代码如下:
借助栈
/**
* 借助栈
* @param root
* @return
*/
List<Integer> res = new ArrayList<>();
public List<Integer> inorderTraversal3 (TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
while (root != null || !stack.isEmpty()) {
// 每一个节点都要找到最左边的节点
while (root != null) {
stack.push(root);
root = root.left;
}
// 路过的节点都压栈,取栈顶元素
root = stack.pop();
res.add(root.val);
// 右子树
root = root.right;
}
return res;
}
借助链表:
/**
* 借助链表
* @param root
* @return
*/
public List<Integer> inorderTraversal2 (TreeNode root) {
List<Integer> res = new LinkedList<>();
LinkedList<TreeNode> stack = new LinkedList<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
// 每一个节点都要找到最左边的节点
while (node != null) {
stack.push(node);
node = node.left;
}
// 路过的节点都压栈,取栈顶元素
node = stack.pop();
result.add(node.val);
// 右子树
node = node.right;
}
return res;
}