Skip to content
二叉树层序遍历
Preview
Preview
逆运算(从层序遍历中生成一棵树)

代码里是构造函数的形式public TreeNode(ArrayList<Integer> arr)

package dataStructure.树;

import com.sun.source.tree.Tree;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

// 二叉树节点类
public class TreeNode {
    public int val;  // 节点值
    public TreeNode left;  // 左节点引用
    public TreeNode right; // 右节点引用
    public TreeNode() {}
    public TreeNode(int x) {
        val = x;
    }
    // 【 从层序遍历中生成一棵树 】

    // 根据一个列表创建一棵树,方便调试代码用的
    // 经常Leetcode提供一个列表表示一棵树
    // 提供的列表其实是层序遍历的结果
    // 当前节点索引i,左子树索引2i+1,右子树索引2i+2

    /**
     * @param arr
     *
     * ArrayList<Integer> list = new ArrayList<>(Arrays.asList(2,3,3,4,5,5,4,null,null,8,9,9,8));
     * TreeNode root = new TreeNode(list);
     *
     */
    public TreeNode(ArrayList<Integer> arr) {
        // 空树或无效输入
        if (arr == null || arr.isEmpty() || arr.get(0) == null) return;
        this.val = arr.get(0);
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(this);

        int i=1;
        while (!queue.isEmpty() && i < arr.size()) {
            TreeNode current = queue.poll();

            // 处理左子节点
            if (i < arr.size() && arr.get(i) != null) {
                current.left = new TreeNode(arr.get(i));
                queue.offer(current.left);
            }
            i++;

            // 处理右子节点
            if (i < arr.size() && arr.get(i) != null) {
                current.right = new TreeNode(arr.get(i));
                queue.offer(current.right);
            }
            i++;
        }

    }
    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}