热点
性能工程师:五大策略优化工具链,建站效能跃升,reasoning_content:我们要求以性能工程师的口吻,写一个与“技术、科技”相关,关于[建站效能跃升:掌握优化工具链的五大核心策略]的标题直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn关键词:性能工程师、技术科技、建站效能跃升、优化工具链、五大核心策略nn可以设计的从性能工程师视角,突出工具链优化、提升建站效能例如:性能工程师秘笈:五大策略重塑建站工具链效能但需要简短或者:建站效能跃升:性能工程师的五大工具链核心策略字数可能略超nn注意标题要吸引人,符合性能工程师口吻,专业感考虑:五步优化工具链,建站效能跃升指南但需要包含“性能工程师”nn或者直接:性能工程师:五大核心策略优化建站工具链nn字数:性能工程师:五大核心策略优化建站工具链(共17字)可以nn或者更简洁:建站效能跃升:性能工程师五大工具链策略(15字)nn但原主题是“掌握优化工具链的五大核心策略”,所以最好体现“掌握”可以考虑:性能工程师:掌握五大工具链策略,建站效能跃升但字多nn权衡后,推荐:性能工程师:五大策略优化工具链,建站效能跃升(18字)或者:建站效能跃升:性能工程师五大核心工具链策略(17字)nn注意“掌握”可省略最终输出一个标题
多端适配全流程:高效建站方案技术详解,reasoning_content:我们要求以开发工程师的口吻,写一个与技术、科技相关,关于[全流程策划:多端建站高效适配方案详解]的标题直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn需要体现开发工程师视角,技术、科技感核心是全流程策划:多端建站高效适配方案详解,但标题要浓缩可能的关键词:多端适配、高效方案、全流程、开发实战、架构策略等nn想到一些标题如:多端适配全流程实战:高效建站方案解析 但字数可能超?数一下:多端适配全流程实战:高效建站方案解析,共18个字(包括冒号)可以更精炼或者从规划到部署:多端适配高效方案详解 但字数也差不多nn也可以直接:全流程策划:多端建站高效适配方案 但缺少详解或者多端建站高效适配全流程方案详解 共15字但需要体现开发工程师口吻,比如实战、架构、原理等考虑多端适配全流程:高效建站方案技术解析 19字nn为了更简短:多端适配高效方案全流程详解 11字,但不够完整或者多端建站高效适配全流程方案 13字nn参考要求是全流程策划:多端建站高效适配方案详解,原题已有冒号可以保留原题但精简?原题18字(包括冒号?全流程策划:多端建站高效适配方案详解 一共17个汉字+一个冒号=18字符)其实可以直接用这个?但要求以开发工程师的口吻,原题已经算策划类,可能不够技术感可以加技术词汇nn最好控制在30字以内,很宽松可以写:多端建站高效适配:全流程方案与实战详解 共16字或者全流程策划:多端建站高效适配方案技术深解 17字或者工程师视角:多端建站高效适配全流程方案 16字nn我倾向于:多端适配全流程:高效建站方案技术详解 16字直接输出这个
容器化与智能编排:系统无碍新范式,reasoning_content:我们要求以全栈工程师的口吻,写一个与“技术、科技”相关,关于“容器化部署与智能编排:构建系统无碍新范式”的标题直接输出一个标题,不要加说明,简短精炼,30字以内nn全栈工程师口吻:可能偏向于实战、工程化、技术深度,也可以有“我”、“我们”视角,但标题通常不需要人称也可以结合“容器化”、“智能编排”、“无碍”(无障碍?或无缝?可能是“无碍”意为无障碍、无故障?)原题“构建系统无碍新范式”可能意思是构建系统无故障/无缝的新范式所以标题要体现容器化部署+智能编排,并突出新范式nn构思:例如“容器化+智能编排:系统无碍新范式” 但字数较多或者“容器化部署与智能编排:构建无碍系统新范式” 但超过30字?数一下:容器化部署与智能编排:构建无碍系统新范式 – 共18字?中文字符:容器化部署与智能编排:构建无碍系统新范式 -> 容器化部署(4) 与(1) 智能编排(4) :(1) 构建(2) 无碍(2) 系统(2) 新范式(3) 总共4+1+4+1+2+2+2+3=19字,在30以内但原题要求“简短精炼”,可以更精炼例如“容器+智能编排:系统无碍新范式” 13字或者“容器化部署+智能编排:无碍系统新范式” 15字nn全栈工程师口吻:可能喜欢用“实战”、“指南”、“之道”等,但标题直接给出即可我选择“容器化部署+智能编排:系统无碍新范式” 共15字,看是否更精炼?或者去掉“部署”:“容器化+智能编排:系统无碍新范式” 13字但“容器化”本身包含部署概念?可能可以或者“容器化与智能编排:系统无碍新范式” 14字最终决定使用“容器化与智能编排:系统无碍新范式”注意不要加引号,直接输出
UI测试工程师的Windows运行库配置与开发环境全攻略,reasoning_content:我们要求以UI测试工程师的口吻写一个与技术、科技相关,关于[Windows运行库配置与管理:轻松搭建开发环境全攻略]的标题需要直接输出标题,不要加说明字数30字以内,简短精炼nn思路:UI测试工程师口吻,可能注重稳定性、兼容性、环境配置等可以结合运行库、配置、开发环境、攻略等词例如:UI测试工程师必看:Windows运行库配置一步到位 但需要更精简或者Windows运行库配置:UI测试环境搭建指南注意不要超过30字nn尝试:UI测试工程师:Windows运行库配置与开发环境搭建全攻略 字数?数一下:UI测试工程师:Windows运行库配置与开发环境搭建全攻略 – 共22个汉字+标点?实际汉字:UI(2字母算2个? 通常中文字数按汉字算,但UI是英文字母,题目说字数控制在30字以内,一般指汉字或字符?安全起见,用中文字符可以写成UI测试工程师即4个汉字+2个字母?严格来说,可以把UI视为两个字符为了简洁,可以写UI测试工程师共5个字符(U、I、测、试、工、程、师?不对,U,I,测,试,工,程,师 7个字符但通常算字数时英文字母算半个或一个?稳妥起见,用全中文表达,比如界面测试工程师但原要求是UI测试工程师,最好保留UInn可以写:【UI测试工程师】Windows运行库配置与环境搭建攻略 – 数一下:【UI测试工程师】Windows运行库配置与环境搭建攻略 – 汉字+符号:共? 【(1)、U(1)、I(1)、(1)、测(1)、试(1)、工(1)、程(1)、师(1)、】(1)、W(1)、i(1)、n(1)、d(1)、o(1)、w(1)、s(1)、运(1)、行(1)、库(1)、配(1)、置(1)、与(1)、环(1)、境(1)、搭(1)、建(1)、攻(1)、略(1) – 共29个字符?还有空格?实际有29个字符,但包含英文字母和符号可能超30?再算:符号算一个,英文字母每个算一个,总共:括号两个, UI两个, 汉字:测试工程师(4) Windows(7) 运行库配置与环境搭建攻略(13) 合计2+2+4+7+13=28加上中间可能没有空格28个,可以但【】可能不必要更简洁:nnUI测试工程师:Windows运行库配置与开发环境搭建 字数:UI测试工程师(7字符) :(1) Windows(7) 运行库配置与开发环境搭建(13) 合计7+1+7+13=28,可以但缺少全攻略意味或者轻松搭建nn另一个:Windows运行库配置:UI测试工程师开发环境搭建指南 字数:Windows运行库配置(11) :(1) UI测试工程师(7) 开发环境搭建指南(9) 合计11+1+7+9=28也不错nn最终选择简洁且有全攻略的考虑:UI测试工程师的Windows运行库配置与开发环境全攻略 字数:UI测试工程师的(8) Windows运行库配置与开发环境全攻略(16) 合计24字OKnn注意:要直接输出,不要加说明所以输出这个
16 9 月 2026, 周三

副标题#e#

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://www.voidcn.com/article/p-srsfcefa-vo.html

?

二叉树

二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

【数据结构】二叉树、AVL树

二叉树有几点重要的性质:

  • ?性质1:在二叉树的第 i 层上至多有2i-1 个结点。 (i≥1)
  • 性质2:深度为 k 的二叉树上至多含2k-1 个结点(k≥1)。
  • 性质3:对任何一棵二叉树,若它含有n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0 = n2+1。
  • 性质4:具有 n 个结点的完全二叉树的深度为log2n+1
  • 性质5:若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:
    (1) 若 i=1,则该结点是二叉树的根,无双亲,否则,编号为i/2? 的结点为其双亲结点;
    (2) 若 2i>n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点;
    (3) 若 2i+1>n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。

采用链式存储结构实现二叉树

链式存储二叉树

【数据结构】二叉树、AVL树

?

1.首先我们要构造可以表示二叉树的节点的结构 Binary_node

2.构造类二叉树 Binary_tree,并编写其几个基本的成员函数:

Empty()-检查树是否为空;clear()-将树清空;size()-得到树的大小;leaf_count()-得到叶子数目;height()-得到树高;

以及几个重要的成员函数:

Binary_tree(const Binary_tree<Entry>&original); 拷贝构造成员函数
Binary_tree &operator=(const Binary_tree<Entry>&original);重载赋值操作符
~Binary_tree();析构函数

?

3.分别编写遍历算法的成员函数

void inorder(void(*visit)(Entry &)); 中序遍历(LVR)
void preorder(void(*visit)(Entry &)); 前序遍历(VLR)
void postorder(void(*visit)(Entry &)); 后续遍历(LRV)

因为二叉树的性质,三种遍历算法我们都用递归实现,所以分别编写其递归函数

void recursive_inorder(Binary_node<Entry>*sub_root,void (*visit)(Entry &));
void recursive_preorder(Binary_node<Entry>*sub_root,void(*visit)(Entry &));
void recursive_postorder(Binary_node<Entry>*sub_root,void(*visit)(Entry &));

?

4.作为辅助,我们再编写一个print_tree的函数,用以以括号表示法输出
同样使用递归,编写递归函数void recursive_print(Binary_node<Entry>*sub_root);
几个重要的函数代码如下:

template<class Entry>
void Binary_tree<Entry>::inorder(void(*visit)(Entry &))
//Post: The tree has been traversed in inorder sequence
//Uses: The function recursive_inorder
{
	recursive_inorder(root,visit);
}

template<class Entry>
void Binary_tree<Entry>::recursive_inorder(Binary_node<Entry>*sub_root,void(*visit)(Entry &))
//Pre:  sub_root is either NULL or points to a subtree of the Binary_tree
//Post: The subtree has been traversed in inorder sequence
//Uses: The function recursive_inorder recursively
{
	if(sub_root!=NULL){
		recursive_inorder(sub_root->left,visit);
		(*visit)(sub_root->data);
		recursive_inorder(sub_root->right,visit);
	}
}

template<class Entry>
void Binary_tree<Entry>::preorder(void(*visit)(Entry &))
//Post: The tree has been traversed in preorder sequence
//Uses: The function recursive_preorder
{
	recursive_preorder(root,visit);
}

template<class Entry>
void Binary_tree<Entry>::recursive_preorder(Binary_node<Entry>*sub_root,void(*visit)(Entry &))
//Pre:  sub_root is either NULL or points to a subtree of the Binary_tree
//Post: The subtree has been traversed in preorder sequence
//Uses: The function recursive_preorder recursively
{
	if(sub_root!=NULL){
		(*visit)(sub_root->data);
		recursive_preorder(sub_root->left,visit);
		recursive_preorder(sub_root->right,visit);
	}
}

template<class Entry>
void Binary_tree<Entry>::postorder(void(*visit)(Entry &))
//Post: The tree has been traversed in postorder sequence
//Uses: The function recursive_postorder
{
	recursive_postorder(root,visit);
}

template<class Entry>
void Binary_tree<Entry>::recursive_postorder(Binary_node<Entry>*sub_root,void(*visit)(Entry &))
//Pre:  sub_root is either NULL or points to a subtree fo the Binary_tree
//Post: The subtree has been traversed in postorder sequence
//Uses: The function recursive_postorder recursively
{
	if(sub_root!=NULL){
		recursive_postorder(sub_root->left,visit);
		recursive_postorder(sub_root->right,visit);
		(*visit)(sub_root->data);
	}
}
template<class Entry>
void Binary_tree<Entry>::print_tree()
{
	recursive_print(root);
	cout<<endl;
}

template<class Entry>
void Binary_tree<Entry>::recursive_print(Binary_node<Entry>*sub_root)
{
	if(sub_root!=NULL){
		cout<<sub_root->data;
		cout<<"(";
		recursive_print(sub_root->left);
		cout<<",";
		recursive_print(sub_root->right);
		cout<<")";
	}

}
//其他函数见源码


程序结果

插入二叉树并实现中序、前序和后序遍历

#p#分页标题#e#

【数据结构】二叉树、AVL树

?

AVL树

#p#副标题#e#

AVL树得名于其发明者G.M.Adelson-Velsky和E.M.Landis。AVL树是一个各结点具有平衡高度的扩展的二叉搜索树。在AVL树中,任一结点的两个子树的高度差最多为1,AVL树的高度不会超过1,AVL树既有二叉搜索树的搜索效率又可以避免二叉搜索树的最坏情况(退化树)出现。

【数据结构】二叉树、AVL树

AVL树的表示与二叉搜索树类似,其操作基本相同,但插入和删除方法除外,因为它们必须不断监控结点的左右子树的相对高度,这也正是AVL树的优势所在。

实现AVL树的相关运算

1、首先我们修改结构Binary_node,增加Balance_factor用以表示节点平衡情况

2、从二叉搜索树中派生出AVL树,编写其关键的插入和删除成员函数。

Error_code insert(const Record &new_data);
Error_code remove(const Record &old_data);

3、入和删除函数我们都用递归实现
编写递归函数:

Error_code avl_insert(Binary_node<Record>* &sub_root,const Record &new_data,bool &taller);
Error_code avl_remove(Binary_node<Record>* &sub_root,const Record &target,bool &shorter);

以及几个重要的调用函数:
左旋右旋函数:

void rotate_left(Binary_node<Record>* &sub_root);
void rotate_right(Binary_node<Record>* &sub_root);

两次旋转的左右平衡函数

void right_balance(Binary_node<Record>* &sub_root);
void left_balance(Binary_node<Record>* &sub_root);

删除函数还要分别编写删除左树和删除右树的递归函数

Error_code avl_remove_right(Binary_node<Record>&sub_root,bool &shorter);
Error_code avl_remove_left(Binary_node<Record>*&sub_root,bool &shorter);

?

4、个重要的成员函数代码如下:

template<class Record>
Error_code AVL_tree<Record>::insert(const Record &new_data)
//Post: If the key of new_data is already in the AVL_tree,a code of duplicate_error
//      is returned. Otherwise,a code of success is returned and the Record
//      new_data is inserted into the tree in such a way that the properties of an
//      AVL tree are preserved.
{
	bool taller;
	return avl_insert(root,new_data,taller);
}

template<class Record>
Error_code AVL_tree<Record>::avl_insert(Binary_node<Record>* &sub_root,bool &taller)
//Pre:  sub_root is either NULL or points to a subtree of the AVL tree
//Post: If the key of new_data is already in the subtree,a code of success is returned and the Record 
//      new_data is inserted into the subtree in such a way that the properties of 
//      an AVL tree have been preserved. If the subtree is increase in height,the
//      parameter taller is set to true; otherwise it is set to false
//Uses: Methods of struct AVL_node; functions avl_insert recursively,left_balance,and right_balance
{
	Error_code result=success;
	if(sub_root==NULL){
		sub_root=new Binary_node<Record>(new_data);
		taller=true;
	}
	else if(new_data==sub_root->data){
		result=duplicate_error;
		taller=false;
	}
	else if(new_data<sub_root->data){//Insert in left subtree
		result=avl_insert(sub_root->left,taller);
		if(taller==true)
			switch(sub_root->get_balance()){//Change balance factors
			case left_higher:
				left_balance(sub_root);
				taller=false;
				break;
			case equal_height:
				sub_root->set_balance(left_higher);
				break;
			case right_higher:
				sub_root->set_balance(equal_height);
				taller=false;
				break;
		}
	}
	else{        //Insert in right subtree
		result=avl_insert(sub_root->right,taller);
		if(taller==true)
			switch(sub_root->get_balance()){
			case left_higher:
				sub_root->set_balance(equal_height);
				taller=false;
				break;
			case equal_height:
				sub_root->set_balance(right_higher);
				break;
			case right_higher:
				right_balance(sub_root);
				taller=false; //Rebalancing always shortens the tree
				break;
		}
	}
	return result;
}

template<class Record>
void AVL_tree<Record>::right_balance(Binary_node<Record>* &sub_root)
//Pre:  sub_root points to a subtree of an AVL_tree that is doubly unbalanced
//      on the right
//Post: The AVL properties have been restored to the subtree
{
	Binary_node<Record>* &right_tree=sub_root->right;
	switch(right_tree->get_balance()){
	case right_higher:
		sub_root->set_balance(equal_height);
		right_tree->set_balance(equal_height);
		rotate_left(sub_root);
		break;
	case equal_height:
		cout<<"WARNING: program error detected in right_balance "<<endl;
	case left_higher:
		Binary_node<Record>*sub_tree=right_tree->left;
		switch(sub_tree->get_balance()){
		case equal_height:
			sub_root->set_balance(equal_height);
			right_tree->set_balance(equal_height);
			break;
		case left_higher:
			sub_root->set_balance(equal_height);
			right_tree->set_balance(right_higher);
		case right_higher:
			sub_root->set_balance(left_higher);
			right_tree->set_balance(equal_height);
			break;
		}
		sub_tree->set_balance(equal_height);
		rotate_right(right_tree);
		rotate_left(sub_root);
		break;
	}
}

template<class Record>
void AVL_tree<Record>::left_balance(Binary_node<Record>* &sub_root)
{
	Binary_node<Record>* &left_tree=sub_root->left;
	switch(left_tree->get_balance()){
	case left_higher:
		sub_root->set_balance(equal_height);
		left_tree->set_balance(equal_height);
		rotate_right(sub_root);
		break;
	case equal_height:
		cout<<"WARNING: program error detected in left_balance"<<endl;
	case right_higher:
		Binary_node<Record>*sub_tree=left_tree->right;
		switch(sub_tree->get_balance()){
		case equal_height:
			sub_root->set_balance(equal_height);
			left_tree->set_balance(equal_height);
			break;
		case right_higher:
			sub_root->set_balance(equal_height);
			left_tree->set_balance(left_higher);
			break;
		case left_higher:
			sub_root->set_balance(right_higher);
			left_tree->set_balance(equal_height);
			break;
		}
		sub_tree->set_balance(equal_height);
		rotate_left(left_tree);
		rotate_right(sub_root);
		break;
	}
}

template<class Record>
void AVL_tree<Record>::rotate_left(Binary_node<Record>* &sub_root)
//Pre:  sub_root points to a subtree of the AVL_tree. This subtree has 
//      a nonempty right subtree.
//Post: sub_root is reset to point to its former right child,and the 
//      former sub_root node is the left child of the new sub_root node
{
	if(sub_root==NULL||sub_root->right==NULL)//impossible cases
		cout<<"WARNING: program error detected in rotate_left"<<endl;
	else{
		Binary_node<Record>*right_tree=sub_root->right;
		sub_root->right=right_tree->left;
		right_tree->left=sub_root;
		sub_root=right_tree;
	}
}

template<class Record>
void AVL_tree<Record>::rotate_right(Binary_node<Record>*&sub_root)
{
	if(sub_root==NULL||sub_root->left==NULL)
		cout<<"WARNING:program error in detected in rotate_right"<<endl;
	else{
		Binary_node<Record>*left_tree=sub_root->left;
		sub_root->left=left_tree->right;
		left_tree->right=sub_root;
		sub_root=left_tree;
	}
}

template<class Record>
Error_code AVL_tree<Record>::remove(const Record &old_data)
{
	bool shorter;
	return avl_remove(root,old_data,shorter);
}

template<class Record>
Error_code AVL_tree<Record>::avl_remove(Binary_node<Record>* &sub_root,bool &shorter)
{
	Binary_node<Record>*temp;
	if(sub_root==NULL)return fail;
	else if(target<sub_root->data)
		return avl_remove_left(sub_root,target,shorter);
	else if(target>sub_root->data)
		return avl_remove_right(sub_root,shorter);
	else if(sub_root->left==NULL){//Found target: delete current node
		temp=sub_root;       //Move right subtree up to delete node
		sub_root=sub_root->right;
		delete temp;
		shorter=true;
	}
	else if(sub_root->right==NULL){
		temp=sub_root;   //Move left subtree up to delete node
		sub_root=sub_root->left;
		delete temp;
		shorter=true;
	}
	else if(sub_root->get_balance()==left_higher){
		//Neither subtree is empty; delete from the taller
		temp=sub_root->left;//Find predecessor of target and delete if from left tree
		while(temp->right!=NULL)temp=temp->right;
		sub_root->data=temp->data;
		avl_remove_left(sub_root,temp->data,shorter);
	}
	else{
		temp=sub_root->right;
		while(temp->left!=NULL)temp=temp->left;
		sub_root->data=temp->data;
		avl_remove_right(sub_root,shorter);
	}
	return success;
}

template<class Record>
Error_code AVL_tree<Record>::avl_remove_right(Binary_node<Record>
		   *&sub_root,bool &shorter)
{
	Error_code result=avl_remove(sub_root->right,shorter);
	if(shorter==true)switch(sub_root->get_balance()){
		case equal_height:
			sub_root->set_balance(left_higher);
			shorter=false;
			break;
		case right_higher:
			sub_root->set_balance(equal_height);
			break;
		case left_higher:
			Binary_node<Record>*temp=sub_root->left;
			switch(temp->get_balance()){
			case equal_height:
				temp->set_balance(right_higher);
				rotate_right(sub_root);
				shorter=false;
				break;
			case left_higher:
				sub_root->set_balance(equal_height);
				temp->set_balance(equal_height);
				rotate_right(sub_root);
				break;
			case right_higher:
				Binary_node<Record>*temp_right=temp->right;
				switch(temp_right->get_balance()){
				case equal_height:
					sub_root->set_balance(equal_height);
					temp->set_balance(equal_height);
					break;
				case left_higher:
					sub_root->set_balance(right_higher);
					temp->set_balance(equal_height);
					break;
				case right_higher:
					sub_root->set_balance(equal_height);
					temp->set_balance(left_higher);
					break;
				}
				temp_right->set_balance(equal_height);
				rotate_left(sub_root->left);
				rotate_right(sub_root);
				break;
			}
	}
	return result;
}

template<class Record>
Error_code AVL_tree<Record>::avl_remove_left(Binary_node<Record>
		   *&sub_root,bool &shorter)
{
	Error_code result=avl_remove(sub_root->left,shorter);
	if(shorter==true)
		switch(sub_root->get_balance()){
		case equal_height:
			sub_root->set_balance(right_higher);
			shorter=false;
			break;
		case left_higher:
			sub_root->set_balance(equal_height);
			break;
		case right_higher:
			Binary_node<Record>*temp=sub_root->right;
			switch(temp->get_balance()){
			case equal_height:
				temp->set_balance(left_higher);
				rotate_right(sub_root);
				shorter=false;
				break;
			case right_higher:
				sub_root->set_balance(equal_height);
				temp->set_balance(equal_height);
				rotate_left(sub_root);
				break;
			case left_higher:
				Binary_node<Record>*temp_left=temp->left;
				switch(temp_left->get_balance()){
				case equal_height:
					sub_root->set_balance(equal_height);
					temp->set_balance(equal_height);
					break;
				case right_higher:
					sub_root->set_balance(left_higher);
					temp->set_balance(equal_height);
					break;
				case left_higher:
					sub_root->set_balance(equal_height);
					temp->set_balance(right_higher);
					break;
				}
				temp_left->set_balance(equal_height);
				rotate_right(sub_root->right);
				rotate_left(sub_root);
				break;
			}
	}
	return result;
}


实验结果

#p#副标题#e##p#分页标题#e#

实现如下功能:1)由{4,9,1,8,6,3,5,2,7}建AVL树B,并以括号表示法输出;2)删除B中关键字为8和2的结点,输出结果。

【数据结构】二叉树、AVL树

?

分析总结

#p#副标题#e##p#分页标题#e#

?

采用链式存储结构实现二叉树

  1. 二叉树在插入的时候通过判断待插入数据与根节点数据的大小,若小于根数据,插入左树,反之插入右树(我们规定不许有重复元素);二叉树的存储结构常用于搜索等。但搜索的效率常依赖于树的结构。而树的结构与元素插入顺序有很大关系,用上述方法插入时若插入的元素是有序的,则得到的树与队列几乎没有区别,也起不到优化搜索的目的。
  2. 二叉树的遍历算法最为重要的一点是递归,递归使我们不必关心于具体的遍历每个节点的顺序,而只是将其看做三个部分,即左子树,根节点,右子树,具体子树的遍历仍是调用其递归函数。
    3.在打印树的时候,我写的并不完美,因为对于叶子节点,理想应该不再打印括号,但我通过判断根节点不为空而调用递归函数,即只要节点有元素就会输出(,),还是表达出了树的意思,但并没有想到怎样达到简洁的效果。

实现AVL树的相关运算

  1. AVL树每插入,删除一个节点就会判断树的高度并改变相应节点的平衡因素,每当有节点不再满足AVL树的性质,立即通过旋转得到AVL树
  2. 旋转的函数及其巧妙。而插入和删除元素的函数要考虑的情况非常多,一种情况没有考虑到就可能达不到我们想要的效果,函数的编写需要极大的耐心和对编程语句的熟练掌握。很多地方我是参考书上的,别人的代码我可以理解,但我自己写可能还是会漏掉很多情况。

转载请注明出处:http://www.voidcn.com/article/p-mgfuopiu-vo.html

dawei

您错过了

性能工程师:五大策略优化工具链,建站效能跃升,reasoning_content:我们要求以性能工程师的口吻,写一个与“技术、科技”相关,关于[建站效能跃升:掌握优化工具链的五大核心策略]的标题直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn关键词:性能工程师、技术科技、建站效能跃升、优化工具链、五大核心策略nn可以设计的从性能工程师视角,突出工具链优化、提升建站效能例如:性能工程师秘笈:五大策略重塑建站工具链效能但需要简短或者:建站效能跃升:性能工程师的五大工具链核心策略字数可能略超nn注意标题要吸引人,符合性能工程师口吻,专业感考虑:五步优化工具链,建站效能跃升指南但需要包含“性能工程师”nn或者直接:性能工程师:五大核心策略优化建站工具链nn字数:性能工程师:五大核心策略优化建站工具链(共17字)可以nn或者更简洁:建站效能跃升:性能工程师五大工具链策略(15字)nn但原主题是“掌握优化工具链的五大核心策略”,所以最好体现“掌握”可以考虑:性能工程师:掌握五大工具链策略,建站效能跃升但字多nn权衡后,推荐:性能工程师:五大策略优化工具链,建站效能跃升(18字)或者:建站效能跃升:性能工程师五大核心工具链策略(17字)nn注意“掌握”可省略最终输出一个标题

多端适配全流程:高效建站方案技术详解,reasoning_content:我们要求以开发工程师的口吻,写一个与技术、科技相关,关于[全流程策划:多端建站高效适配方案详解]的标题直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn需要体现开发工程师视角,技术、科技感核心是全流程策划:多端建站高效适配方案详解,但标题要浓缩可能的关键词:多端适配、高效方案、全流程、开发实战、架构策略等nn想到一些标题如:多端适配全流程实战:高效建站方案解析 但字数可能超?数一下:多端适配全流程实战:高效建站方案解析,共18个字(包括冒号)可以更精炼或者从规划到部署:多端适配高效方案详解 但字数也差不多nn也可以直接:全流程策划:多端建站高效适配方案 但缺少详解或者多端建站高效适配全流程方案详解 共15字但需要体现开发工程师口吻,比如实战、架构、原理等考虑多端适配全流程:高效建站方案技术解析 19字nn为了更简短:多端适配高效方案全流程详解 11字,但不够完整或者多端建站高效适配全流程方案 13字nn参考要求是全流程策划:多端建站高效适配方案详解,原题已有冒号可以保留原题但精简?原题18字(包括冒号?全流程策划:多端建站高效适配方案详解 一共17个汉字+一个冒号=18字符)其实可以直接用这个?但要求以开发工程师的口吻,原题已经算策划类,可能不够技术感可以加技术词汇nn最好控制在30字以内,很宽松可以写:多端建站高效适配:全流程方案与实战详解 共16字或者全流程策划:多端建站高效适配方案技术深解 17字或者工程师视角:多端建站高效适配全流程方案 16字nn我倾向于:多端适配全流程:高效建站方案技术详解 16字直接输出这个