[Typescript学习]二叉树的Typescript实现

本文介绍了一种使用TypeScript实现二叉树的方法,包括二叉树节点类和二叉树类的设计。文中详细展示了如何通过这些类来构建二叉树,并提供了节点数量、树高度的计算方法以及先序、中序、后序遍历的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[typescript学习]二叉树的Typescript实现

前言

为了做个rpg小游戏,学习了typescript。人物到NPC移动打算用A*寻路算法。学习算法的时候,顺便复习了一下数据结构。

要实现的二叉树:
要实现的二叉树

二叉树节点类

class BiNode {
	data:any //节点内容
	key:number //key值
	isVisted:boolean //是否访问过
	leftChild:BiNode //左孩子
	rightChild:BiNode // 右孩子
	constructor(key:number,data:any) {
		this.key = key;
		this.data = data;
	}
};

二叉树类

class BiTree {
	root:BiNode;

	constructor(key:number, data:any) {
		this.root = new BiNode(key,data)
	}
  //获取二叉树节点个数
	private _size(subTree:BiNode):number{
		if(subTree == null){
			return 0;
		}else{
			return 1 + this._size(subTree.leftChild) + this._size(subTree.rightChild);
		}
	}
  public size():number{
		return this._size(this.root)
	}
	//获取二叉树层级数
	private _height(subTree:BiNode):number {
		if(subTree == null){
			return 0;
		}else{                   
			let i = this._height(subTree.leftChild);
			let j = this._height(subTree.rightChild);
			return (i < j)?(j + 1):(i + 1);
		}
	}
	public  height():number{
		return this._height(this.root);
	}

	public visted(node:BiNode){
		node.isVisted = true;
	}
	// 二叉树先序遍历
	private _preOrder(node:BiNode):string{
		if(node != null){
			let str = '';
			this.visted(node);
			str += node.data;
			str += this._preOrder(node.leftChild);
			str += this._preOrder(node.rightChild);
			return str;
		}else{
			return '';
		}
	}

	public preOrder():string{
		return this._preOrder(this.root);
	}

	//二叉树中序遍历
	private _inOrder(node:BiNode):string{
		if(node != null){
			let str = '';
			this.visted(node);
			str += this._inOrder(node.leftChild);
			str += node.data;
			str += this._inOrder(node.rightChild);
			return str;
		}else{
			return '';
		}
	}
	public inOrder():string{
		return this._inOrder(this.root);
	}
	//二叉树后序遍历
	private _postOrder(node:BiNode):string{
		if(node != null){
			let str = '';
			this.visted(node);
			str += this._postOrder(node.leftChild);
			str += this._postOrder(node.rightChild);
			str += node.data;
			return str;
		}else{
			return '';
		}
	}
	public postOrder():string{
		return this._postOrder(this.root);
	}
};

构建一个二叉树

/*
 *           A 
 *     B          C 
 *  D     E            F
 */
function createBiTree (root:BiNode){
	let arr = ['B','C','D','E','F'];
	let nodeArr = new Array<BiNode>();
	arr.forEach((value,index) =>{
		let node = new BiNode(index + 2, value);
		nodeArr.push(node);
	})
	root.leftChild = nodeArr[0];
	root.rightChild = nodeArr[1];
	nodeArr[0].leftChild = nodeArr[2];
	nodeArr[0].rightChild = nodeArr[3];
	nodeArr[1].leftChild = nodeArr[4];
	nodeArr[1].rightChild = nodeArr[5];
}

测试

let tree = new BiTree(1,'[A]');
createBiTree(tree.root);

console.log('size:',tree.size());
console.log('height:',tree.height());
console.log('先序遍历:',tree.preOrder());
console.log('中序遍历:',tree.inOrder());
console.log('后序遍历:',tree.postOrder());

输出:

size: 6
height: 3
先序遍历: [A]BDECF
中序遍历: DBE[A]FC
后序遍历: DEBFC[A]

参考

  1. 【数据结构】二叉树的原理及实现学习总结
  2. TypeScript Handbook(中文版)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值