📖
Data Structure
  • 基本概念
  • 线性表
    • 顺序表
    • 链表
    • 广义表
  • 栈
  • 队列
  • 字符串
  • 树
    • 二叉树
    • 二叉搜索树
    • 平衡二叉树
    • 堆
    • 哈夫曼树
  • 图
    • DFS
    • BFS
  • 排序
    • 选择排序
    • 插入排序
    • 比较选择排序和插入排序
    • 希尔排序
  • 常用算法
    • 排序
    • 二叉树遍历
    • 根据两种遍历顺序重构树
    • 二叉树深度
    • 最近公共祖先
    • 回溯集合
    • N Sum
    • union-find
  • 常用算法时间复杂度速查表
由 GitBook 提供支持
在本页
  • 1. 先序遍历
  • 2. 中序遍历
  • 3. 后序遍历
  • 4. 层序遍历

这有帮助吗?

  1. 常用算法

二叉树遍历

1. 先序遍历

public List<Integer> preorderTraversal(TreeNode root) {
    
    List<Integer> res = new ArrayList<>();
    preorderTraversal(root, res);
    return res;
    
}

private void preorderTraversal(TreeNode root, List<Integer> list) {

    if (root == null) return ;

    list.add(root.val);
    preorderTraversal(root.left, list);
    preorderTraversal(root.right, list);

}
public List<Integer> preorderTraversal(TreeNode root) {

    List<Integer> res = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    
    while (root != null || !stack.isEmpty()) {
    
        while (root != null) {
            res.add(root.val);
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        root = root.right;
    }
    
    return res;
}

2. 中序遍历

public List<Integer> inorderTraversal(TreeNode root) {
    
    List<Integer> res = new ArrayList<>();
    inorderTraversal(root, res);
    return res;
    
}

private void inorderTraversal(TreeNode root, List<Integer> list) {
    
    if (root == null) return ;
            
    inorderTraversal(root.left, list);
    list.add(root.val);
    inorderTraversal(root.right, list);
    
}
public List<Integer> inorderTraversal(TreeNode root) {
    
    List<Integer> res = new ArrayList<>();
    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;
}

3. 后序遍历

public List<Integer> postorderTraversal(TreeNode root) {

    List<Integer> res = new ArrayList<>();
    postorderTraversal(root,res);
    return res;

}

private void postorderTraversal(TreeNode root, List<Integer> list) {

    if (root == null) return ;

    postorderTraversal(root.left, list);
    postorderTraversal(root.right, list);
    list.add(root.val);

}
public List<Integer> postorderTraversal(TreeNode root) {

    List<Integer> res = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();

    while (root != null || !stack.isEmpty()) {

        while (root != null) {
            stack.push(root);
            root = root.left == null ? root.right : root.left;
        } 
        TreeNode temp = stack.pop();
        res.add(temp.val);
        if (!stack.isEmpty() && stack.peek().left == temp) {
            root = stack.peek().right;
        }        
    }
    return res;
}

4. 层序遍历

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> resultList = new ArrayList<>();
    if (root == null) return resultList;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    while (!queue.isEmpty()) {
        List<Integer> list = new ArrayList<>();
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            if (queue.peek().left != null) queue.add(queue.peek().left);
            if (queue.peek().right != null) queue.add(queue.peek().right);
            list.add(queue.poll().val);
        }
        resultList.add(list);
    }
    return resultList;
}
上一页排序下一页根据两种遍历顺序重构树

最后更新于4年前

这有帮助吗?