1.首先,我们先来了解一下二叉树的特性:
一个二叉树的第i层的最大节点数为: 2^(i-1), i>=1
深度为k的二叉树有最大节点总数为: 2^k-1, k>=1
对于任何非空二叉树 T,若n0表示叶子结点的个数,n2是度为2的非叶子结点的个数,两者满足关系:n0=n2+1
2.二叉搜索树(又名二叉排序树、二叉查找树)
(1)首先我们看一下二叉搜索树的遍历(先序遍历、中序遍历、后续遍历):
function BinaryTree() {
// 构造结点
let Node = function (key) {
this.key = key;
this.left = null;
this.right = null;
}
let root = null;
// 插入结点的方法
let 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.insert = function (key) {
let newNode = new Node(key);
if (root === null) {
root = newNode;
} else {
insertNode(root, newNode);
}
};
//先序遍历
let preOrderTraverseNode = function (node, callback) {
if (node !== null) {
callback(node.key);
preOrderTraverseNode(node.left, callback);
preOrderTraverseNode(node.right, callback);
}
}
this.preOrderTraverse = function (callback) {
preOrderTraverseNode(root, callback);
}
//中序遍历
let inOrderTraverseNode = function (node, callback) {
if (node !== null) {
inOrderTraverseNode(node.left, callback);
callback(node.key);
inOrderTraverseNode(node.right, callback);
}
}
this.inOrderTraverse = function (callback) {
inOrderTraverseNode(root, callback);
}
//后序遍历
let postOrderTraverseNode = function (node, callback) {
if (node !== null) {
postOrderTraverseNode(node.left, callback);
postOrderTraverseNode(node.right, callback);
callback(node.key);
}
}
this.postOrderTraverse = function (callback) {
postOrderTraverseNode(root, callback);
}
}
// 测试方法
let nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13];
let binaryTree = new BinaryTree();
nodes.forEach(function (key) {
binaryTree.ins