构建二叉树的链表算法

流程图

下面是构建二叉树的链表算法的整体流程图:

graph TD
A[开始] --> B(创建链表)
B --> C(创建二叉树)
C --> D(构建二叉树)
D --> E(输出二叉树)
E --> F(结束)

代码实现

创建链表

创建一个链表的函数,用于将输入的序列转换为链表。

/**
* 创建链表
* @param values 输入的序列
* @return 返回链表的头结点
*/
public ListNode createList(int[] values) {
    if (values == null || values.length == 0) {
        return null;
    }
    
    ListNode head = new ListNode(values[0]);
    ListNode current = head;
    for (int i = 1; i < values.length; i++) {
        ListNode node = new ListNode(values[i]);
        current.next = node;
        current = current.next;
    }
    
    return head;
}

创建二叉树

创建一个二叉树的函数,用于将链表转换为二叉树。

/**
* 创建二叉树
* @param head 链表的头结点
* @return 返回二叉树的根结点
*/
public TreeNode createTree(ListNode head) {
    if (head == null) {
        return null;
    }
    
    List<TreeNode> nodeList = new ArrayList<>();
    while (head != null) {
        nodeList.add(new TreeNode(head.val));
        head = head.next;
    }
    
    int size = nodeList.size();
    for (int i = 0; i < size / 2; i++) {
        TreeNode node = nodeList.get(i);
        node.left = nodeList.get(2 * i + 1);
        node.right = nodeList.get(2 * i + 2);
    }
    
    return nodeList.get(0);
}

构建二叉树

构建二叉树的函数,调用创建链表和创建二叉树的函数,完成链表到二叉树的转换。

/**
* 构建二叉树
* @param values 输入的序列
* @return 返回二叉树的根结点
*/
public TreeNode buildBinaryTree(int[] values) {
    ListNode head = createList(values);
    TreeNode root = createTree(head);
    return root;
}

输出二叉树

输出二叉树的函数,用于按层次遍历的顺序输出二叉树的节点值。

/**
* 输出二叉树
* @param root 二叉树的根结点
*/
public void printBinaryTree(TreeNode root) {
    if (root == null) {
        return;
    }
    
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        
        // 输出节点值
        System.out.print(node.val + " ");
        
        if (node.left != null) {
            queue.offer(node.left);
        }
        
        if (node.right != null) {
            queue.offer(node.right);
        }
    }
    
    System.out.println();
}

完整代码

下面是完整的实现代码:

import java.util.*;

class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
    }
}

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

public class BinaryTreeBuilder {
    /**
    * 创建链表
    * @param values 输入的序列
    * @return 返回链表的头结点
    */
    public ListNode createList(int[] values) {
        if (values == null || values.length == 0) {
            return null;
        }
        
        ListNode head = new ListNode(values[0]);
        ListNode current = head;
        for (int i = 1; i < values.length; i++) {
            ListNode node = new ListNode(values[i]);
            current.next = node;
            current = current.next;
        }
        
        return head;
    }

    /**
    * 创建二叉树
    * @param head 链表的头结点
    * @return 返回二叉树的根结点
    */
    public TreeNode createTree(ListNode head) {
        if (head == null) {
            return null;
        }
        
        List<TreeNode> nodeList = new ArrayList<>();
        while (head != null) {
            nodeList.add(new TreeNode(head.val));
            head = head.next;
        }
        
        int size = nodeList.size();
        for (int i = 0; i < size / 2