Tree的学习

demo代码如下。欢迎指正与讨论。

#include <iostream>
#include <queue>
#include <stack>
using namespace std;

template <typename T> 
struct BinaryNode{
	T elem;
	BinaryNode *left;
	BinaryNode * right;
	BinaryNode(T d, BinaryNode *l=NULL, BinaryNode *r=NULL):elem(d),left(l),right(r){};
};

BinaryNode<int> * constructTestingTree(){
	BinaryNode<int> * leaf24 = new BinaryNode<int>(24);
	BinaryNode<int> * leaf23 = new BinaryNode<int>(23);
	BinaryNode<int> * leaf22 = new BinaryNode<int>(22);
	BinaryNode<int> * leaf21 = new BinaryNode<int>(21);

	BinaryNode<int> * leaf12 = new BinaryNode<int>(12, leaf23, leaf24);
	BinaryNode<int> * leaf11 = new BinaryNode<int>(11, leaf21, leaf22);

	BinaryNode<int> * root = new BinaryNode<int>(0, leaf11, leaf12);
	return root;
}

BinaryNode<int> * constructSearchTree(){
	BinaryNode<int> * leaf24 = new BinaryNode<int>(8);
	BinaryNode<int> * leaf23 = new BinaryNode<int>(6);
	BinaryNode<int> * leaf22 = new BinaryNode<int>(4);
	BinaryNode<int> * leaf21 = new BinaryNode<int>(1);

	BinaryNode<int> * leaf12 = new BinaryNode<int>(7, leaf23, leaf24);
	BinaryNode<int> * leaf11 = new BinaryNode<int>(3, leaf21, leaf22);

	BinaryNode<int> * root = new BinaryNode<int>(5, leaf11, leaf12);
	return root;
}

////////////////
///////basic operation

void inorderTraversal_recursive(BinaryNode<int> * root){
	if(root == NULL)
		return;
	inorderTraversal_recursive(root -> left);
	cout << root -> elem << endl;
	inorderTraversal_recursive(root -> right);
}

void preorderTraversal_recursive(BinaryNode<int> * root){
	if(root == NULL)
		return;
	cout << root -> elem << endl;
	preorderTraversal_recursive(root -> left);
	preorderTraversal_recursive(root -> right);
}

void preorderTraversal_stack(BinaryNode<int> * root){
	stack<BinaryNode<int> *> s;
	s.push(root);
	while(!s.empty() ){
		BinaryNode<int> * temp = s.top();
		s.pop();
		cout << temp -> elem << endl;
		if(temp -> right != NULL)
			s.push(temp -> right);
		if(temp -> left != NULL)
			s.push(temp -> left);
		}
}

void postorderTraversal_recursive(BinaryNode<int> * root){
	if(root == NULL)
		return;
	postorderTraversal_recursive(root -> left);
	postorderTraversal_recursive(root -> right);
	cout << root -> elem << endl;
}

void levelTraversal(BinaryNode<int> * root){
	queue<BinaryNode<int> *> q;
	q.push(root);
	while(!q.empty()){
		BinaryNode<int> * temp = q.front();
		q.pop();
		cout << temp -> elem << endl;
		if(temp -> left != NULL)
			q.push(temp -> left);
		if(temp -> right != NULL)
			q.push(temp -> right);
	}
}

/////////////////////////////
//////search tree
BinaryNode<int> * search(BinaryNode<int> * root, int key){
	if(root == NULL)
		return NULL;
	else if(root -> elem == key)
		return root;
	else{
		if(root -> left != NULL && root -> elem > key)
			return search(root -> left, key);
		else if(root -> right != NULL && root -> elem < key)
			return search(root -> right, key);
		else
			return NULL;
	}
}

void insert(BinaryNode<int> * & root, int key){
	if(root == NULL){
		root = new BinaryNode<int>(key);
		return;
	}
	else{
		if(key > root -> elem)
			insert(root->right, key);
		else if(key < root -> elem)
			insert(root->left, key);
	}
}

BinaryNode<int> * largest(BinaryNode<int> * &root){
	if(root -> right == NULL)
		return root;
	else 
		largest(root -> right);
}

BinaryNode<int> * largestFather(BinaryNode<int> * &root){
	if(root -> right -> right == NULL)
		return root;
	else 
		largest(root -> right);
}

void deleteThis(BinaryNode<int> * & root){
	if(root -> left == NULL && root -> right == NULL){
		//delete root;
		root = NULL;
	}
	else if(root -> left == NULL && root -> right != NULL )
		root = root -> right;
	else if(root -> left != NULL && root -> right == NULL)
		root = root -> left;
	else{
		BinaryNode<int> * large = largest(root -> left);
		BinaryNode<int> * largeFather = largestFather(root -> left);

		root -> elem = large -> elem;
		deleteThis(large);
	}
}

bool deletion(BinaryNode<int> * & root, int key){
	if(root == NULL)
		return 0;
	if(root -> elem > key)
		return deletion(root -> left, key);
	else if(root -> elem < key)
		return deletion(root -> right, key);
	else if(root -> elem == key){
		deleteThis(root);
		return 1;
	}
}

int main(){
	BinaryNode<int> * root = constructSearchTree();
	////////////////
	/////basic operation

	//inorderTraversal_recursive(root);
	//cout << endl;
	//preorderTraversal_recursive(root);
	//cout << endl;
	//preorderTraversal_stack(root);
	//cout << endl;
	//postorderTraversal_recursive(root);
	//cout << endl;
	//levelTraversal(root);
	//cout << endl;

	//////////////////
	////////search tree

	//BinaryNode<int> * node = search(root, 7);
	//levelTraversal(node);
	insert(root, 2);
	//levelTraversal(root);
	cout << deletion(root, 2) << endl << endl;
	cout << deletion(root, 5) << endl << endl;
	levelTraversal(root);
	return 0;
}

Tree的学习,布布扣,bubuko.com

时间: 2024-10-29 04:44:21

Tree的学习的相关文章

B tree索引学习总结

b tree索引 索引的结构: 1.创建一个测试表 create table it (x number ,y varchar2(100)); 2.插入一万行数据 begin for i in 1..100000 loop insert into it values(i,rpad(i,100,'*')); end loop; end; / 3.创建索引在x列上 create index idx_it on it(x); 4.收集表信息 SQL> exec dbms_stats.gather_tab

设备树(device tree)学习笔记一

如何查看编译生成的设备树的内容? 在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助.这里我们需要使用设备树生成工具dtc的反汇编功能 [email protected]:~/tq2440/Linux/linux-4.0.1# ./scripts/dtc/dtc -h Usage: dtc [options] <input file> Options: -[qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv] -q, --quiet Q

20145216史婧瑶《信息安全系统设计基础》第3周学习总结

20145216史婧瑶<信息安全系统设计基础>第3周学习总结 教材学习内容总结 十六进制表示法C表示法以0x或0X开头的数字常量为十六进制进制转换常用进制:二进制(B),十进制(D),八进制(O或者Q),十六进制(H) 转换为二进制-十六进制相互转换,二进制的四位数字对应十六进制的一位数字. 同理,二进制与八进制的转化是三位对应一位. 但是通常情况下,进制转换都以二进制为桥梁进行转换. 对于一个字长为w位的机器来说,虚拟地址的范围是0~2^w-1.程序最多访问2的w次方个字节. 数据大小: 在

《信息安全系统设计基础》第3周学习总结

20145336张子扬 <信息安全系统设计基础>第3周学习总结 教材学习内容总结 p24 在参考p30页的代码,添加main函数测试 p35页  练习2.11 进行gdb单步跟踪测试 p44页 p47和p49页的代码 49 在敲这个代码时,忘记定义了一个函数,这需要运用到28页的代码,再修改之后代码可以继续运行 使用gdb跟踪测试 p78 教材学习中的问题和解决过程 为啥我的虚拟机每次下载的东西在重启之后都没了啊 中午下载perl,在重启虚拟机之后机不见了 课后作业中的问题和解决过程 2.56

20145317《信息安全系统设计基础》第五周学习总结2

20145317<信息安全系统设计基础>第五周学习总结2 教材学习内容总结 X86 寻址方式经历三代: DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8060的分段模式 IA32的带保护模式的平坦模式 程序编程 1.代码含义 gcc -01 -o p p1.c -01 表示使用第一级优化.优化的级别与编译时间和最终产生代码的形式都有关系,一般认为第二级优化-02 是较好的选择. -o 表示将p1.c编译后的可执行文件命名为p 2.机器级编程的两种抽象 指令集结构ISA 是机器级程

(转)XGBoost 与 Boosted Tree |《XGBoost 与 Boosted Tree | 我爱计算机》

//转自 <XGBoost 与 Boosted Tree | 我爱计算机> 1. 前言应 @龙星镖局  兄邀请写这篇文章.作为一个非常有效的机器学习方法,Boosted Tree是数据挖掘和机器学习中最常用的算法之一.因为它效果好,对于输入要求不敏感,往往是从统计学家到数据科学家必备的工具之一,它同时也是kaggle比赛冠军选手最常用的工具.最后,因为它的效果好,计算复杂度不高,也在工业界中有大量的应用. 2. Boosted Tree的若干同义词说到这里可能有人会问,为什么我没有听过这个名字

Boosted Tree

原文:http://www.52cs.org/?p=429 作者:陈天奇,毕业于上海交通大学ACM班,现就读于华盛顿大学,从事大规模机器学习研究. 注解:truth4sex  编者按:本文是对开源xgboost库理论层面的介绍,在陈天奇原文<梯度提升法和Boosted Tree>的基础上,做了如下注解:1)章节划分:2)注解和参考链接(以蓝色和红色字体标注).备注:图片可点击查看清晰版. 1. 前言应 @龙星镖局  兄邀请写这篇文章.作为一个非常有效的机器学习方法,Boosted Tree是数

dsu on tree

osu on tree? dsu on tree! 这种操作可以在O(nlogn)的时间内解决一些无修改子树询问问题. 咱知道把一棵树轻重链剖分后,树的轻链,重链都只有O(logn)个. 这个算法就是利用了这一点,递归处理时保留重儿子的信息,轻儿子的则重新计算. 乍一看感觉很暴力,但是实际上是O(nlogn)的. 来看几道题吧. CodeForces - 600E 1 #include<cstdio> 2 #include<vector> 3 #include<bitset&

码云配合git入门命令总结学习

目录 码云配合git入门命令总结学习 基本设置 基本命令总结学习 准备工作以及基本思路 基本命令 码云搭建仓库步骤 准备前工作 具体操作方法 远程仓库基本命令 标签相关命令 所有命令总结 基本命令总结说明 远程库有关的命令说明 标签相关命令 容易混淆的命令 码云配合git入门命令总结学习 基本设置 设置用户名及email: git config --global user.name "Your Name" git config --global user.email "[em