翻转二叉树
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
分析
翻转二叉树即将二叉树左右互换,从上到下依次。
图解:
步骤拆分: 步骤一:root 保持不变
步骤二:第二层左节点和右节点交换
步骤三:第三层左侧可以将2看作root,执行步骤二的交换。同时将右侧可以将7看作root,执行步骤二的交换
.
.
.
如有更多层,以此类推
本例较为简单可分为三组,其都需要做反转交换的操作,且逻辑一样,另外这三组数据又有关联性,那么只需要使用递归算法,即可完成整个二叉树的翻转操作。
相关代码和注释如下:
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)