datastructure-ts
Version:
Collection of data structures(LinkedList, DoubleLinkedList, Stack, Queue, Dictionary and etc...) for TypeScript.
171 lines (147 loc) • 5.22 kB
text/typescript
export class TreeNode<T> {
// =========================================================================================================================================================
// Public properties
// =========================================================================================================================================================
/**
* Value of the node.
*/
value: T;
/**
* Parent of the node.
*/
parent: TreeNode<T> | null = null;
/**
* Children of the node.
*/
children: TreeNode<T>[] = [];
// =========================================================================================================================================================
// Private properties
// =========================================================================================================================================================
// =========================================================================================================================================================
// Constructor
// =========================================================================================================================================================
constructor(value: T) {
this.value = value;
}
// =========================================================================================================================================================
// Public methods
// =========================================================================================================================================================
/**
* Returns the value of the node.
*/
getValue(): T {
return this.value;
}
/**
* Sets the value of the node.
* @param value
*/
setValue(value: T): void {
this.value = value;
}
/**
* Returns the parent of the node.
*/
getParent(): TreeNode<T> | null {
return this.parent;
}
/**
* Sets the parent of the node.
* @param parent
*/
setParent(parent: TreeNode<T>): void {
this.parent = parent;
}
/**
* Returns the children of the node.
*/
getChildren(): TreeNode<T>[] {
return this.children;
}
/**
* Adds a child to the node.
* @param child
*/
addChild(child: TreeNode<T>): void {
child.setParent(this);
this.children.push(child);
}
/**
* Removes a child from the node.
* @param child
*/
removeChild(child: TreeNode<T>): void {
const index = this.children.indexOf(child);
if (index !== -1) {
this.children.splice(index, 1);
child.setParent(null);
}
}
/**
* Removes all children from the node.
*/
isLeaf(): boolean {
return this.children.length === 0;
}
/**
* Returns the height of the node.
*/
getHeight(): number {
if (this.isLeaf()) {
return 0;
} else {
return Math.max(...this.children.map(child => child.getHeight())) + 1;
}
}
/**
* Returns the depth of the node.
*/
getDepth(): number {
if (this.parent === null) {
return 0;
} else {
return this.parent.getDepth() + 1;
}
}
/**
* Traverse the tree in preorder (root, left subtree, right subtree) and apply the given callback function to each node.
* @param callback The callback function to apply to each node.
*/
traversePreorder(callback: (node: TreeNode<T>) => void): void {
callback(this);
this.children.forEach(child => child.traversePreorder(callback));
}
/**
* Traverse the tree in postorder (left subtree, right subtree, root) and apply the given callback function to each node.
* @param callback The callback function to apply to each node.
*/
traversePostorder(callback: (node: TreeNode<T>) => void): void {
this.children.forEach(child => child.traversePostorder(callback));
callback(this);
}
/**
* Traverse the tree in inorder (left subtree, root, right subtree) and apply the given callback function to each node.
* @param callback The callback function to apply to each node.
*/
traverseInorder(callback: (node: TreeNode<T>) => void): void {
if (this.children.length >= 1) {
this.children[0].traverseInorder(callback);
}
callback(this);
if (this.children.length >= 2) {
this.children[1].traverseInorder(callback);
}
}
/**
* Traverse the tree level by level, starting at the root, and apply the given callback function to each node.
* @param callback The callback function to apply to each node.
*/
traverseLevelOrder(this: TreeNode<T>, callback: (node: TreeNode<T>) => void): void {
const queue = [this];
while (queue.length > 0) {
const node = queue.shift()!;
callback(node);
node.children.forEach(child => queue.push(child));
}
}
}