二叉树

深度遍历dfs

递归进行
根据cout在循环中的位置来确定是哪一种遍历

前序

void PreOrder(TreeNode *root){
	while(root){
		cout<<root->val;
		PreOrder(root->left);
		PreOrder(root->right);
	}
}

中序

void InOrder(TreeNode *root){
	while(root){
		PreOrder(root->left);
		cout<<root->val;
		PreOrder(root->right);
	}
}

后序

void PostOrder(TreeNode *root){
	while(root){
		PreOrder(root->left);
		PreOrder(root->right);
		cout<<root->val;
	}
}

层次遍历bfs

利用队列先进先出的性质进行遍历

void LevelOrder(TreeNode *root){
	if(!root)
		return;
	TreeNode t;
	vector<int> ans;
	queue<TreeNode*> q;
	q.push(root);
	while(!q.empty()){
		t=q.front();
		q.pop();
		ans.push_back(t->val);
		if(root->left) q.push(root->left);
		if(root->right) q.push(root->right);
	}
}

遍历二叉树的应用

输出二叉树中的叶子结点

在遍历的时候增加判断条件:左右子树是否都为空即可
以前序遍历为例子

void PreOrder(TreeNode *root){
	while(root){
		if(!root->left&&!root->right){
			cout<<root->val;
		}
		PreOrder(root->left);
		PreOrder(root->right);
	}
}

求二叉树的高度

分别求出左树和右树的高度,返回最大值

int GetHeight(TreeNode *root){
	int lh,rh,maxh=0;
	if(root){
		lh=GetHeight(root->left);//左树高度
		rh=GetHeight(root->rigth);//右树高度
		maxh=lh>rh? lh:rh;//比较求最大高度
		return maxh+1;
	}
	else
		return 0;//递归出口
}

二元运算表达式树及其运算

在这里插入图片描述
三种遍历方式可得到不同的表达式结果

先序遍历:前缀表达式
中序遍历:中缀表达式
后序遍历:后缀表达式

如何由中缀表达式求二元运算表达式树?

由中缀表达式求后缀表达式
则中缀与后缀分别是树的中序与后续遍历
由两种遍历方法构建树

如何由中缀表达式求后缀表达式?
表达式求值

如何根据两种遍历方式构建树?

由两种遍历序列确定二叉树

在已知中序遍历和其他一种遍历的情况下才能唯一确定一棵树

以由后序和中序遍历确定二叉树为例

//in_order[l1..r1],post_order[l2..r2]
int build(int l1,int r1,int l2,int r2){
	if(l1>r1)
		return 0;//空树
	int root=post_order[r2];//由后序遍历直接找到根节点
	int p=l1;
	while(in_order[p] != root)
		p++;//在中序遍历中找到根节点的位置
	int cnt=p-l1;//左子树的节点个数
	//通过数组构造出二叉树
	lch[root]=bulid(l1,p-1,l2,l2+cnt-1);
	rch[root]=build(p+1,r1,l2+cnt,r2-1);
	return root;
}

二叉搜索树

二叉搜索树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值