You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
15 KiB
1 lines
15 KiB
{"ast":null,"code":"import { IndexerL2R } from \"./IAdapter\";\nexport class TreeNode {\n constructor(data = undefined, parent = undefined, name) {\n this._parent = void 0;\n this._children = void 0;\n this.name = void 0;\n this.data = void 0;\n this._parent = parent;\n this._children = undefined;\n this.name = name;\n this.data = data;\n\n if (this._parent !== undefined) {\n this._parent.addChild(this);\n }\n }\n /**\r\n * 判断某个节点是不是当前节点的祖先节点\r\n * @param ancestor \r\n * @returns \r\n */\n\n\n isDescendantOf(ancestor) {\n if (ancestor === undefined) {\n return false;\n } //从当前节点向上遍历\n //let node: TreeNode<T> | undefined = this._parent; //不明白为啥要添加这句\n\n\n for (let node = this._parent; node !== undefined; node = (_node = node) === null || _node === void 0 ? void 0 : _node._parent) {\n var _node;\n\n if (node === ancestor) {\n return true;\n }\n }\n\n return false;\n }\n\n getChildAt(index) {\n if (this._children === undefined) {\n return undefined;\n }\n\n if (index < 0 || index > this._children.length) {\n return undefined;\n }\n\n return this._children[index];\n }\n\n removeChildAt(index) {\n if (this._children === undefined) {\n return undefined;\n }\n\n let child = this.getChildAt(index);\n\n if (child === undefined) {\n return undefined;\n }\n\n this._children.splice(index, 1);\n\n child._parent = undefined;\n return child;\n }\n\n removeChild(child) {\n if (child === undefined) {\n return undefined;\n }\n\n if (this._children === undefined) {\n return undefined;\n }\n\n let index = -1;\n\n for (let i = 0; i < this._children.length; i++) {\n if (this.getChildAt(i) === child) {\n index = i;\n break;\n }\n }\n\n if (index === -1) {\n return undefined;\n }\n\n return this.removeChildAt(index);\n }\n /**\r\n * 把当前节点在父节点中删除\r\n */\n\n\n remove() {\n if (this._parent !== undefined) {\n return this._parent.removeChild(this);\n }\n\n return undefined;\n }\n\n addChildAt(child, index) {\n //第一种情况,如果child是本节点的祖先节点,是不允许的\n if (this.isDescendantOf(child)) {\n return undefined;\n } //延迟初始化的处理\n\n\n if (this._children === undefined) {\n this._children = [];\n }\n\n if (index >= 0 && index <= this._children.length) {\n //第二种情况,child已经是别人的子节点,那要先去除和别人的关系\n if (child._parent !== undefined) {\n child._parent.removeChild(child);\n } //第三种情况 正常情况\n\n\n child._parent = this;\n\n this._children.splice(index, 0, child);\n\n return child;\n } else {\n return undefined;\n }\n }\n\n addChild(child) {\n if (this._children === undefined) {\n this._children = [];\n }\n\n return this.addChildAt(child, this._children.length);\n }\n\n get parent() {\n return this._parent;\n }\n\n get childCount() {\n if (this._children !== undefined) {\n return this._children.length;\n }\n\n return 0;\n }\n\n hasChild() {\n return this._children !== undefined && this._children.length > 0;\n }\n\n get root() {\n let curr = this;\n\n while (curr !== undefined && curr._parent !== undefined) {\n curr = curr._parent;\n }\n\n return curr;\n }\n\n get depth() {\n let curr = this;\n let level = 0;\n\n while (curr !== undefined && curr._parent !== undefined) {\n curr = curr._parent;\n level++;\n }\n\n return level;\n }\n\n repeatString(target, n) {\n let total = \"\";\n\n for (let i = 0; i < n; i++) {\n total += target;\n }\n\n return total;\n }\n\n visit(preOrderFunc = null, postOrderFunc = null, indexFunc = IndexerL2R) {\n if (preOrderFunc !== null) {\n preOrderFunc(this);\n }\n\n let arr = this._children;\n\n if (arr !== undefined) {\n for (let i = 0; i < arr.length; i++) {\n let child = this.getChildAt(indexFunc(arr.length, i));\n\n if (child !== undefined) {\n child.visit(preOrderFunc, postOrderFunc, indexFunc);\n }\n }\n }\n\n if (postOrderFunc !== null) {\n postOrderFunc(this);\n }\n }\n\n}","map":{"version":3,"sources":["/home/blobt/Documents/dev/node/triangle/src/render/TreeNode.ts"],"names":["IndexerL2R","TreeNode","constructor","data","undefined","parent","name","_parent","_children","addChild","isDescendantOf","ancestor","node","getChildAt","index","length","removeChildAt","child","splice","removeChild","i","remove","addChildAt","childCount","hasChild","root","curr","depth","level","repeatString","target","n","total","visit","preOrderFunc","postOrderFunc","indexFunc","arr"],"mappings":"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","sourcesContent":["import { Indexer, IndexerL2R } from \"./IAdapter\";\r\n\r\nexport type NodeCallback<T> = (node: TreeNode<T>) => void;\r\nexport class TreeNode<T> {\r\n private _parent: TreeNode<T> | undefined;\r\n private _children: Array<TreeNode<T>> | undefined;\r\n public name: string;\r\n public data: T | undefined;\r\n\r\n public constructor(data: T | undefined = undefined, parent: TreeNode<T> | undefined = undefined, name: string) {\r\n this._parent = parent;\r\n this._children = undefined;\r\n this.name = name;\r\n this.data = data;\r\n if (this._parent !== undefined) {\r\n this._parent.addChild(this);\r\n }\r\n }\r\n\r\n /**\r\n * 判断某个节点是不是当前节点的祖先节点\r\n * @param ancestor \r\n * @returns \r\n */\r\n public isDescendantOf(ancestor: TreeNode<T> | undefined): boolean {\r\n if (ancestor === undefined) {\r\n return false;\r\n }\r\n //从当前节点向上遍历\r\n //let node: TreeNode<T> | undefined = this._parent; //不明白为啥要添加这句\r\n for (let node: TreeNode<T> | undefined = this._parent; node !== undefined; node = node?._parent) {\r\n if (node === ancestor) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public getChildAt(index: number): TreeNode<T> | undefined {\r\n if (this._children === undefined) {\r\n return undefined;\r\n }\r\n if (index < 0 || index > this._children.length) {\r\n return undefined;\r\n }\r\n return this._children[index];\r\n }\r\n\r\n public removeChildAt(index: number): TreeNode<T> | undefined {\r\n if (this._children === undefined) {\r\n return undefined;\r\n }\r\n let child: TreeNode<T> | undefined = this.getChildAt(index);\r\n if (child === undefined) {\r\n return undefined;\r\n }\r\n this._children.splice(index, 1);\r\n child._parent = undefined;\r\n return child;\r\n }\r\n\r\n public removeChild(child: TreeNode<T> | undefined): TreeNode<T> | undefined {\r\n if (child === undefined) {\r\n return undefined;\r\n }\r\n if (this._children === undefined) {\r\n return undefined;\r\n }\r\n let index: number = -1;\r\n for (let i = 0; i < this._children.length; i++) {\r\n if (this.getChildAt(i) === child) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n if (index === -1) {\r\n return undefined;\r\n }\r\n return this.removeChildAt(index);\r\n }\r\n\r\n /**\r\n * 把当前节点在父节点中删除\r\n */\r\n public remove(): TreeNode<T> | undefined {\r\n if (this._parent !== undefined) {\r\n return this._parent.removeChild(this);\r\n }\r\n return undefined;\r\n }\r\n\r\n public addChildAt(child: TreeNode<T>, index: number): TreeNode<T> | undefined {\r\n //第一种情况,如果child是本节点的祖先节点,是不允许的\r\n if (this.isDescendantOf(child)) {\r\n return undefined;\r\n }\r\n\r\n //延迟初始化的处理\r\n if (this._children === undefined) {\r\n this._children = [];\r\n }\r\n\r\n if (index >= 0 && index <= this._children.length) {\r\n //第二种情况,child已经是别人的子节点,那要先去除和别人的关系\r\n if (child._parent !== undefined) {\r\n child._parent.removeChild(child);\r\n }\r\n\r\n //第三种情况 正常情况\r\n child._parent = this;\r\n this._children.splice(index, 0, child);\r\n return child;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n public addChild(child: TreeNode<T>): TreeNode<T> | undefined {\r\n if (this._children === undefined) {\r\n this._children = [];\r\n }\r\n return this.addChildAt(child, this._children.length);\r\n }\r\n\r\n public get parent(): TreeNode<T> | undefined {\r\n return this._parent;\r\n }\r\n\r\n public get childCount(): number {\r\n if (this._children !== undefined) {\r\n return this._children.length;\r\n }\r\n return 0;\r\n }\r\n\r\n public hasChild(): boolean {\r\n return this._children !== undefined && this._children.length > 0;\r\n }\r\n\r\n public get root(): TreeNode<T> | undefined {\r\n let curr: TreeNode<T> | undefined = this;\r\n while (curr !== undefined && curr._parent !== undefined) {\r\n curr = curr._parent;\r\n }\r\n return curr;\r\n }\r\n\r\n public get depth(): number {\r\n let curr: TreeNode<T> | undefined = this;\r\n let level: number = 0;\r\n\r\n while (curr !== undefined && curr._parent !== undefined) {\r\n curr = curr._parent;\r\n level++;\r\n }\r\n\r\n return level;\r\n }\r\n public repeatString(target: string, n: number): string {\r\n let total: string = \"\";\r\n for (let i = 0; i < n; i++) {\r\n total += target;\r\n }\r\n return total;\r\n }\r\n public visit(preOrderFunc: NodeCallback<T> | null = null, postOrderFunc: NodeCallback<T> | null = null, indexFunc: Indexer = IndexerL2R): void {\r\n if (preOrderFunc !== null) {\r\n preOrderFunc(this);\r\n }\r\n\r\n let arr: Array<TreeNode<T>> | undefined = this._children;\r\n if (arr !== undefined) {\r\n for (let i: number = 0; i < arr.length; i++) {\r\n let child: TreeNode<T> | undefined = this.getChildAt(indexFunc(arr.length, i));\r\n if(child !== undefined){\r\n child.visit(preOrderFunc, postOrderFunc, indexFunc);\r\n }\r\n }\r\n }\r\n\r\n if (postOrderFunc !== null) {\r\n postOrderFunc(this);\r\n }\r\n }\r\n}"]},"metadata":{},"sourceType":"module"}
|