剑指offer面试题19:二叉树的镜像
题目描述:请完成一个函数,该函数输出二叉树的镜像
function BinaryTree(){
var Node = function(key){
this.key = key;
this.left = null;
this.right = null;
}
var root = null;
this.insert = function(key) {
var newNode = new Node(key);
if(root === null) {
root = newNode;
}else{
insertNode(root, newNode);
}
}
//创建一个二叉搜索树
var insertNode = function(node, newNode) {
if(newNode.key < node.key) {
if(node.left === null) {
node.left = newNode;
} else {
insertNode(node.left, newNode);
}
} else {
if(node.right === null) {
node.right = newNode;
} else {
insertNode(node.right, newNode);
}
}
};
this.Mirror = function() {
MirrorRecursively(root);
}
//求一个二叉树的镜像
var MirrorRecursively = function(node) {
if(node === null) {
return;
}
if(node.left === null && node.right === null) {
return node;
}
//交换左右结点
var temp = node.left;
node.left = node.right;
node.right = temp;
if(node.left) {
MirrorRecursively(node.left);
}
if(node.right) {
MirrorRecursively(node.right);
}
}
//中遍历一颗二叉树
this.inOrderTraverse = function(callback) {
inOrderTraverseNode(root, callback);
}
var inOrderTraverseNode = function(node, callback) {
if(node !== null) {
inOrderTraverseNode(node.left, callback);
callback(node);
inOrderTraverseNode(node.right, callback);
}
}
}
var tree = new BinaryTree();
tree.insert(11);
tree.insert(7);
tree.insert(15);
tree.insert(5);
tree.insert(3);
tree.insert(9);
tree.insert(8);
tree.insert(13);
tree.insert(12);
tree.insert(14);
tree.insert(20);
tree.insert(18);
tree.insert(25);
tree.insert(6);
//回调函数
function printNode(value) {
console.log(value);
}
tree.inOrderTraverse(printNode);
console.log("************************我是分界线**********")
tree.Mirror();
tree.inOrderTraverse(printNode);