export class BinaryTreeNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
export class BinaryTree {
constructor(value) {
if (value === undefined) {
this.root = null;
} else {
this.root = value instanceof BinaryTreeNode ? value : new BinaryTreeNode(value);
}
}
size() {
const countNode = node => {
if (node == null) {
return 0;
}
return 1 + countNode(node.left) + countNode(node.right);
}
return this.root === null ? 0 :countNode(this.root);
}
height() {
const getHeight = (node) => {
if (node == null) {
return -1;
}
return 1 + Math.max(getHeight(node.left), getHeight(node.right));
};
return this.root === null ? 0 : getHeight(this.root);
}
inOrder() {
const result = [];
const dfs = (node) => {
if (node === null) return;
dfs(node.left);
result.push(node.value);
dfs(node.right);
};
dfs(this.root);
return result;
}
preOrder() {
const result = [];
const dfs = (node) => {
if (node === null) return;
result.push(node.value);
dfs(node.left);
dfs(node.right);
};
dfs(this.root);
return result;
}
postOrder() {
const result = [];
const dfs = (node) => {
if (node === null) return;
dfs(node.left);
dfs(node.right);
result.push(node.value);
};
dfs(this.root);
return result;
}
isBalanced() {
const checkHeight = (node) => {
if (node === null) return 0;
const leftHeight = checkHeight(node.left);
if (leftHeight === -1) return -1;
const rightHeight = checkHeight(node.right);
if (rightHeight === -1) return -1;
if (Math.abs(leftHeight - rightHeight) > 1) {
return -1;
}
return 1 + Math.max(leftHeight, rightHeight);
};
return checkHeight(this.root) !== -1;
}
isComplete() {
if (this.root === null) return true;
const queue = [this.root];
let seenNull = false;
while (queue.length > 0) {
const node = queue.shift();
if (node === null) {
seenNull = true;
} else {
if (seenNull) {
return false;
}
queue.push(node.left);
queue.push(node.right);
}
}
return true;
}
}