JS翻转二叉树

218 阅读1分钟

翻转二叉树

翻转一棵二叉树。

示例:

输入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

分析

翻转二叉树即将二叉树左右互换,从上到下依次。

图解:

image.png

步骤拆分: 步骤一:root 保持不变

步骤二:第二层左节点和右节点交换

步骤三:第三层左侧可以将2看作root,执行步骤二的交换。同时将右侧可以将7看作root,执行步骤二的交换

.

.

.

如有更多层,以此类推

image.png

image.png

image.png

本例较为简单可分为三组,其都需要做反转交换的操作,且逻辑一样,另外这三组数据又有关联性,那么只需要使用递归算法,即可完成整个二叉树的翻转操作。

相关代码和注释如下:

function TreeCode() {
  let NodeTree = function (ele) {
    this.val = ele;
    this.left = null;
    this.right = null;
  }

  this.createTree = function () {
    let tree = new NodeTree('4');
    tree.left = new NodeTree('2');
    tree.right = new NodeTree('7');
    tree.left.left = new NodeTree('D');
    tree.left.left.left = new NodeTree('G');
    tree.left.left.right = new NodeTree('H');
    tree.right.left = new NodeTree('E');
    tree.right.right = new NodeTree('F');
    tree.right.left.right = new NodeTree('I');
    return tree;
  }
}

// 创建二叉树数据结构,并且生成一个二叉树
let treeCode = new TreeCode();
let root = treeCode.createTree()

// 翻转操作
const revertTree = (listNode) => {
  // 递归结束的条件: 即当前 node 作为 root时,没有左右节点。
  if (listNode === null) {
    return null
  }
  // 递归翻转子节点
  const right = revertTree(listNode.left)
  const left = revertTree(listNode.right)
  // 当前节点的交换
  listNode.left = left
  listNode.right = right

  // 返回结果
  return listNode
}

const s = revertTree(root)
console.log(s)