构建二叉树的链表算法
流程图
下面是构建二叉树的链表算法的整体流程图:
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
















