数据结构(二)树

数据结构(二)树

1、二叉树基本操作

#include<iostream>
using namespace std;
/**
二叉树基本操作算法
*/
struct BinaryNode {
	char data;
	BinaryNode *left;
	BinaryNode *right;
};
//1.先序创建二叉树
void createBinaryTree(BinaryNode *&root) {
	char data;
	cin>>data;
	if(data=='#') {
		root=NULL;
	} else {
		//使用递归先序创建二叉树
		root=new BinaryNode;
		root->data=data;
		root->left=root->right=NULL;
		createBinaryTree(root->left);
		createBinaryTree(root->right);
	}
}
//2.二叉树遍历
//2.1二叉树先序遍历
void showBinaryTree(BinaryNode *&root) {
	if(root!=NULL) {
		cout<<root->data;
		showBinaryTree(root->left);
		showBinaryTree(root->right);
	}
}
//2.2二叉树中序遍历

//2.3二叉树后序遍历

//int main() {
//	BinaryNode *rootNode;
//	createBinaryTree(rootNode);
//	showBinaryTree(rootNode);
//
//}

2、使用数组实现二叉查找

#include<iostream>
using namespace std;
/*
使用结点数组进行二叉查找  
*/ 
struct Node{
	int index;
	char data;
}; 
//递归实现 
char binarySearch(Node *arr,int low,int high,int key){
	 if(low>high){
	 	return NULL;
	 }
	 if(arr[(low+high)/2].index==key){
	 	return arr[(low+high)/2].data;
	 }
	 if(arr[(low+high)/2].index>key){
	 	return binarySearch(arr,low,(low+high)/2, key);
	 }
	 if(arr[(low+high)/2].index<key){
	 	return binarySearch(arr,(low+high)/2, high,key);
	 }
}
//循环实现
char circleBinarySerach(Node *arr,int n,int key){
	int low=0,high=n,middle=n/2;
	while(low<high){
		if(arr[middle].index==key){
			return arr[middle].data;
		} 
		if(arr[middle].index<key){
			low=middle;
			middle=(low+high)/2; 
		}
		if(arr[middle].index>key){
			high=middle;
			middle=(low+high)/2;
		}
	} 
	return NULL;
}  
//int main(){
//	Node nodes[5]={{1,'A'},{5,'B'},{8,'C'},{9,'D'},{25,'E'}};
//	//这里解释下最高位为什么是5不是4,如果是4的话就永远到达不了arr[4],因此最高位为5
//	//	cout<<binarySearch(nodes,0,5,25);
// 	cout<<circleBinarySerach(nodes,5,25);
//} 

3、计算二叉树的深度

#include<iostream>
#include<math.h>
using namespace std;
/*
	计算二叉树的深度 
*/
struct BinaryNode{
	char data;
	BinaryNode *left,*right;
};
int depth(BinaryNode *&root){
	if(root==NULL){
		return 0;
	}
	if(root->left==NULL&&root->right==NULL){
		return 1;
	}
	int lTDepth=depth(root->left)+1;
	int rTDepth=depth(root->right)+1;
	return max(lTDepth,rTDepth);
} 
//1.先序创建二叉树
void createBinaryTree(BinaryNode *&root) {
	char data;
	cin>>data;
	if(data=='#') {
		root=NULL;
	} else {
		//使用递归先序创建二叉树
		root=new BinaryNode;
		root->data=data;
		root->left=root->right=NULL;
		createBinaryTree(root->left);
		createBinaryTree(root->right);
	}
}
int main(){
	BinaryNode *rootNode;
	createBinaryTree(rootNode);
	cout<<"depth:"<<depth(rootNode);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值