diff --git a/src/IAdapter.ts b/src/IAdapter.ts index 91ddbe7f..e0dcfcd9 100755 --- a/src/IAdapter.ts +++ b/src/IAdapter.ts @@ -1,3 +1,11 @@ +export type Indexer = (len: number, idx: number) => number; +export function IndexerL2R(len: number, idx: number): number { + return idx; +} +export function IndexerR2L(len: number, idx: number): number { + return (len - idx - 1); +} + export interface IAdapter { add(t: T): void; remove(): T | undefined; diff --git a/src/IEnumerator.ts b/src/IEnumerator.ts new file mode 100755 index 00000000..cd6994e9 --- /dev/null +++ b/src/IEnumerator.ts @@ -0,0 +1,5 @@ +export interface IEnumberator { + reset(): void; + moveNext(): boolean; + readonly current: T | undefined; +} \ No newline at end of file diff --git a/src/NodeB2TEnumberator.ts b/src/NodeB2TEnumberator.ts new file mode 100755 index 00000000..612d8b84 --- /dev/null +++ b/src/NodeB2TEnumberator.ts @@ -0,0 +1,35 @@ +import { IEnumberator } from "./IEnumerator"; +import { TreeNode } from "./TreeNode"; + +export class NodeB2TEnumerator implements IEnumberator>{ + private _iter: IEnumberator>; + private _arr: Array | undefined>; + private _arrIdx: number; + + public constructor(iter: IEnumberator>) { + this._iter = iter; + this.reset(); + } + public reset(): void { + this._arr = []; + //调用先根枚举器,把结果存入数组 + while (this._iter.moveNext()) { + this._arr.push(this._iter.current); + } + //设置_arrIdx为数组的length,因为从尾部先前遍历 + this._arrIdx = this._arr.length; + } + + public get current(): TreeNode | undefined { + if (this._arrIdx >= this._arr.length) { + return undefined; + } else { + return this._arr[this._arrIdx]; + } + } + + public moveNext(): boolean { + this._arrIdx--; + return (this._arrIdx >= 0 && this._arrIdx < this._arr.length); + } +} \ No newline at end of file diff --git a/src/NodeEnumeratorFactory.ts b/src/NodeEnumeratorFactory.ts new file mode 100755 index 00000000..8062718e --- /dev/null +++ b/src/NodeEnumeratorFactory.ts @@ -0,0 +1,90 @@ +import { IndexerL2R, IndexerR2L } from "./IAdapter"; +import { IEnumberator } from "./IEnumerator"; +import { NodeT2BEnumberator } from "./NodeT2BEnumerator"; +import { TreeNode } from "./TreeNode"; +import { Stack } from "./Stack"; +import { Queue } from "./Queue"; +import { NodeB2TEnumerator } from "./NodeB2TEnumberator"; + +export class NodeEnumeratorFactory { + + /** + * 创建深度优先,从左到右,从上到下的枚举器 + * @param node + * @returns + */ + public static create_df_l2r_t2b_iter(node: TreeNode | undefined): IEnumberator> { + let iter: IEnumberator> = new NodeT2BEnumberator(node, IndexerR2L, Stack); + return iter; + } + + /** + * 创建深度优先,从右到左,从上到下的枚举器 + * @param node + * @returns + */ + public static create_df_r2l_t2b_iter(node: TreeNode | undefined): IEnumberator> { + let iter: IEnumberator> = new NodeT2BEnumberator(node, IndexerL2R, Stack); + return iter; + } + + /** + * 创建广度优先,从左到右,从上到下的枚举器 + * @param node + * @returns + */ + public static create_bf_l2r_t2b_iter(node: TreeNode | undefined): IEnumberator> { + let iter: IEnumberator> = new NodeT2BEnumberator(node, IndexerL2R, Queue); + return iter; + } + + /** + * 创建广度优先,从右到左,从上到下的枚举器 + * @param node + * @returns + */ + public static create_bf_r2l_t2b_iter(node: TreeNode | undefined): IEnumberator> { + let iter: IEnumberator> = new NodeT2BEnumberator(node, IndexerR2L, Queue); + return iter; + } + + /** + * 创建深度优先,从左到右,从下到上的枚举器 + * @param node + * @returns + */ + public static create_df_l2r_b2t_iter(node: TreeNode | undefined): IEnumberator> { + let iter: IEnumberator> = new NodeB2TEnumerator(NodeEnumeratorFactory.create_df_r2l_t2b_iter(node)); + return iter; + } + + /** + * 创建深度优先,从右到左,从下到上的枚举器 + * @param node + * @returns + */ + public static create_df_r2l_b2t_iter(node: TreeNode | undefined): IEnumberator> { + let iter: IEnumberator> = new NodeB2TEnumerator(NodeEnumeratorFactory.create_df_l2r_t2b_iter(node)); + return iter; + } + + /** + * 创建广度优先,从左到右,从下到上的枚举器 + * @param node + * @returns + */ + public static create_bf_l2r_b2t_iter(node: TreeNode | undefined): IEnumberator> { + let iter: IEnumberator> = new NodeB2TEnumerator(NodeEnumeratorFactory.create_bf_r2l_t2b_iter(node)); + return iter; + } + + /** + * 创建广度优先,从右到左,从下到上的枚举器 + * @param node + * @returns + */ + public static create_bf_r2l_b2t_iter(node: TreeNode | undefined): IEnumberator> { + let iter: IEnumberator> = new NodeB2TEnumerator(NodeEnumeratorFactory.create_bf_l2r_t2b_iter(node)); + return iter; + } +} \ No newline at end of file diff --git a/src/NodeT2BEnumerator.ts b/src/NodeT2BEnumerator.ts new file mode 100755 index 00000000..c7e99392 --- /dev/null +++ b/src/NodeT2BEnumerator.ts @@ -0,0 +1,54 @@ +import { IAdapter, Indexer } from "./IAdapter"; +import { IEnumberator } from "./IEnumerator"; +import { TreeNode } from "./TreeNode"; + +export class NodeT2BEnumberator>> implements IEnumberator> { + private _node: TreeNode | undefined; + private _adapter !: IAdapter>; + private _currNode !: TreeNode | undefined; + private _indexer !: IdxFunc; + + public constructor(node: TreeNode | undefined, func: IdxFunc, adapter: new () => Adapter) { + if (node === undefined) { + return; + } + this._node = node; + this._indexer = func; + this._adapter = new adapter(); + this._currNode = undefined; + this._adapter.add(this._node); //将根节点放入到堆栈或队列中 + } + reset(): void { + if (this._node === undefined) { + return; + } + this._currNode = undefined; + this._adapter.clear(); + this._adapter.add(this._node); + } + moveNext(): boolean { + if (this._adapter.isEmpty) { + return false; + } + //弹出头或尾元素,依赖adapter是stack还是queue + this._currNode = this._adapter.remove(); + + if (this._currNode !== undefined) { + //获取当前节点的儿子个数 + let len: number = this._currNode.childCount; + + for (let i = 0; i < len; i++) { + let childIdx: number = this._indexer(len, i); + let child: TreeNode | undefined = this._currNode.getChildAt(childIdx); + if(child !== undefined){ + this._adapter.add(child); + } + } + } + return true; + } + public get current(): TreeNode | undefined { + return this._currNode; + } + +} \ No newline at end of file diff --git a/src/Queue.ts b/src/Queue.ts index b1ef6986..04fee9d5 100755 --- a/src/Queue.ts +++ b/src/Queue.ts @@ -1,7 +1,7 @@ import { AdapterBase } from "./AdapterBase"; import { List } from "./List"; -export class Quene extends AdapterBase{ +export class Queue extends AdapterBase{ public remove(): T | undefined { if (this._arr.length > 0) { if (this._arr instanceof List) { diff --git a/src/ThreeNode.ts b/src/TreeNode.ts similarity index 73% rename from src/ThreeNode.ts rename to src/TreeNode.ts index 510dc92c..d2263885 100755 --- a/src/ThreeNode.ts +++ b/src/TreeNode.ts @@ -1,10 +1,10 @@ -export class ThreeNode { - private _parent: ThreeNode | undefined; - private _children: Array> | undefined; +export class TreeNode { + private _parent: TreeNode | undefined; + private _children: Array> | undefined; public name: string | undefined; public data: T | undefined; - public constructor(data: T | undefined = undefined, parent: ThreeNode | undefined = undefined, name: string) { + public constructor(data: T | undefined = undefined, parent: TreeNode | undefined = undefined, name: string) { this._parent = parent; this._children = undefined; this.name = name; @@ -19,13 +19,13 @@ export class ThreeNode { * @param ancestor * @returns */ - public isDescendantOf(ancestor: ThreeNode | undefined): boolean { + public isDescendantOf(ancestor: TreeNode | undefined): boolean { if (ancestor === undefined) { return false; } //从当前节点向上遍历 - let node: ThreeNode | undefined = this._parent; //不明白为啥要添加这句 - for (let node: ThreeNode | undefined = this._parent; node != undefined; node = node?._parent) { + let node: TreeNode | undefined = this._parent; //不明白为啥要添加这句 + for (let node: TreeNode | undefined = this._parent; node != undefined; node = node?._parent) { if (node === ancestor) { return true; } @@ -33,7 +33,7 @@ export class ThreeNode { return false; } - public getChildAt(index: number): ThreeNode | undefined { + public getChildAt(index: number): TreeNode | undefined { if (this._children === undefined) { return undefined; } @@ -43,11 +43,11 @@ export class ThreeNode { return this._children[index]; } - public removeChildAt(index: number): ThreeNode | undefined { + public removeChildAt(index: number): TreeNode | undefined { if (this._children === undefined) { return undefined; } - let child: ThreeNode | undefined = this.getChildAt(index); + let child: TreeNode | undefined = this.getChildAt(index); if (child === undefined) { return undefined; } @@ -56,7 +56,7 @@ export class ThreeNode { return child; } - public removeChild(child: ThreeNode | undefined): ThreeNode | undefined { + public removeChild(child: TreeNode | undefined): TreeNode | undefined { if (child === undefined) { return undefined; } @@ -79,14 +79,14 @@ export class ThreeNode { /** * 把当前节点在父节点中删除 */ - public remove(): ThreeNode | undefined { + public remove(): TreeNode | undefined { if (this._parent !== undefined) { return this._parent.removeChild(this); } return undefined; } - public addChildAt(child: ThreeNode, index: number): ThreeNode | undefined { + public addChildAt(child: TreeNode, index: number): TreeNode | undefined { //第一种情况,如果child是本节点的祖先节点,是不允许的 if (this.isDescendantOf(child)) { return undefined; @@ -112,14 +112,14 @@ export class ThreeNode { } } - public addChild(child: ThreeNode): ThreeNode | undefined { + public addChild(child: TreeNode): TreeNode | undefined { if (this._children === undefined) { this._children = []; } return this.addChildAt(child, this._children.length); } - public get parent(): ThreeNode | undefined { + public get parent(): TreeNode | undefined { return this._parent; } @@ -134,8 +134,8 @@ export class ThreeNode { return this._children !== undefined && this._children.length > 0; } - public get root(): ThreeNode | undefined { - let curr: ThreeNode | undefined = this; + public get root(): TreeNode | undefined { + let curr: TreeNode | undefined = this; while (curr !== undefined && curr._parent !== undefined) { curr = curr._parent; } @@ -143,7 +143,7 @@ export class ThreeNode { } public get depth() :number{ - let curr: ThreeNode | undefined = this; + let curr: TreeNode | undefined = this; let level: number = 0; while(curr !== undefined && curr._parent !== undefined){