给定一个二叉树的根节点?root
?,返回?它的?中序?遍历?。
示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
思路1:
递归??
递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中
三要素:递归函数的参数定义和返回值,递归终止条件,单层递归逻辑
在Java中,树的定义
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> ans = new ArrayList<>();
inorder(root, ans);
return ans;
}
public void inorder(TreeNode root, List<Integer> ans) {
if (root == null)
return;
inorder(root.left, ans);
ans.add(root.val);
inorder(root.right, ans);
}
}
思路2:
迭代
前序遍历顺序:中-左-右,入栈顺序:中-右-左
中序遍历顺序:左-中-右,入栈顺序:左-右
?后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果
前序迭代
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null)
return ans;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
ans.add(node.val);
if (node.right != null)
stack.push(node.right);
if (node.left != null)
stack.push(node.left);
}
return ans;
}
}
中序迭代
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null)
return ans;
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
ans.add(cur.val);
cur = cur.right;
}
}
return ans;
}
}
后序迭代方法1最后翻转
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null)
return ans;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
ans.add(node.val);
if (node.left != null)
stack.push(node.left);
if (node.right != null)
stack.push(node.right);
}
Collections.reverse(ans);
return ans;
}
}
方法2:使用头插法
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> result = new LinkedList<>();
Stack<TreeNode> stack = new Stack();
while (root != null || !stack.isEmpty()) {
if (root != null) {
stack.push(root);
result.addFirst(root.val);
root = root.right;
} else {
root = stack.pop();
root = root.left;
}
}
return result;
}
}