遍历的思路一致,只是需要调整下“打印” 的顺序。
/**
* 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> preorderTraversal(TreeNode root) {
if(root == null){
return new ArrayList<>();
}
List<Integer> left = preorderTraversal(root.left);
List<Integer> right = preorderTraversal(root.right);
List<Integer> list = new ArrayList<>();
list.add(root.val);
list.addAll(left);
list.addAll(right);
return list;
}
}
class Solution {//遍历思想
private List<Integer> list = new ArrayList<>();
private void pre(TreeNode root){
if(root != null){
list.add(root.val);
pre(root.left);
pre(root.right);
}
}
public List<Integer> preorderTraversal(TreeNode root) {
list.clear();
pre(root);
return list;
}
}
非递归:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
while(cur != null){
list.add(cur.val);
stack.push(cur);
cur = cur.left;
}
cur = stack.pop().right;
}
return list;
}
}
中序遍历:递归
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
if(root == null){
return new ArrayList<>();
}
List<Integer> left = inorderTraversal(root.left);
List<Integer> right = inorderTraversal(root.right);
List<Integer> list = new ArrayList<>();
list.addAll(left);
list.add(root.val);
list.addAll(right);
return list;
}
}
class Solution {
private List<Integer> list = new ArrayList<>();
private void ino(TreeNode root){
if(root != null){
ino(root.left);
list.add(root.val);
ino(root.right);
}
}
public List<Integer> inorderTraversal(TreeNode root) {
list.clear();
ino(root);
return list;
}
}
非递归:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.pop();
list.add(top.val);
cur = top.right;
}
return list;
}
}
后序遍历:递归
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
if(root == null){
return new ArrayList<>();
}
List<Integer> list = new ArrayList<>();
list.addAll(postorderTraversal(root.left));
list.addAll(postorderTraversal(root.right));
list.add(root.val);
return list;
}
}
class Solution {
private List<Integer> list = new ArrayList<>();
private void pos(TreeNode root){
if(root != null){
pos(root.left);
pos(root.right);
list.add(root.val);
}
}
public List<Integer> postorderTraversal(TreeNode root) {
list.clear();
pos(root);
return list;
}
}
非递归:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
TreeNode last = null;// 上一次被完全遍历完的结点
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.peek();
if(top.right == null || top.right == last){
list.add(top.val);
stack.pop();
last = top;
} else{
cur = top.right;
}
}
return list;
}
}