二叉树 二叉树转双向链表

121 阅读1分钟

题目

b6c9cc3b9d804864f797737e6e05931c.png

  • 二叉树要转成双向链表,如果只有三个,那么顶点和左右节点相互执行,构成双向链表,顶点在中间,左右节点在首位
  • 其他位置一样,每个节点要构成双向链表,那么该节点在中间,和左边子树构成的双向链表的尾部相互指,和右边子树构成的双向链表的头节点相互指
  • 构造二叉树返回结构,返回的左节点包含自身构成链表的首位节点,右节点包含自身构成链表的首位节点
class Node {
  constructor(leftNode, rightNode) {
    this.startNode = leftNode;
    this.endNode = rightNode;
  }
}

function process(binaryNode) {
  if (binaryNode === null) {
    return new Node(null, null);
  }

  const leftHeadNode = process(binaryNode.left);
  const rightHeadNode = process(binaryNode.right);

  // 左树链表的最后一个点
  if (leftHeadNode.endNode !== null) {
    leftHeadNode.endNode.right = binaryNode;
  }
  binaryNode.left = leftHeadNode.endNode;

  // 右树链表的第一个点
  binaryNode.right = rightHeadNode.startNode;
  if (rightHeadNode.startNode !== null) {
    rightHeadNode.startNode.left = binaryNode;
  }

  // 构造每个节点能获取到其左树构成的链表的头,右树构成链表的尾
  return new Node(
    leftHeadNode.startNode !== null ? leftHeadNode.startNode : binaryNode, // 左侧链表的头
    rightHeadNode.endNode !== null ? rightHeadNode.endNode : binaryNode // 右侧链表的尾
  );
}