PAT备考之 二叉树 专题

二叉树的考题能不建树就不建树,建树也用静态比较简单

1、序列转换

        作为核心考点树里的核心,需要非常熟练理解掌握树序列的转化(不建树)。做题时有一个思想是,有了包含中序的两个序列,树就有了,其余问题都可在序列上进行。

        理解是关键,不要死记硬背。

vector<int> pre,in,post,le[N]        (记录前序、中序、后序、层序)

(1)已知前序中序(pre(N),in(N)),转后序(记录层序)

void trail(int root,int start,int end,int level){
    if(start>end) return;
	int index=pre[root];
	int i=start;
	while(in[i]!=index) i++;
	le[level].push_back(index);    //记录层序
	trail(root+1,start,i-1,level+1);
	trail(root+i-start+1,i+1,end,level+1);
	post.push_back(index);    //记录后序方法可选择,位置在这即可
	return; 
}

(2)已知中序后序(post(N),in(N)),转前序(记录层序)

void trail(int root,int start,int end,int level){
	if(start>end) return;
	int index=post[root];
	int i=start;
	while(in[i]!=index) i++;
	pre.push_back(index);    //先序的记录位置不要搞错
	le[level].push_back(index); //记录层序
	trail(root-end+i-1,start,i-1,level+1);
	trail(root-1,i+1,end,level+1);
	return;
}

(3) 已知前序后序,转中序

不常见,因为序列不唯一,详见 PAT A 1119

2、堆、完全二叉树

用一个int heap[N+1]来记录(N个结点,标号从1开始)

完全二叉树最重要的核心性质就是要抓住对于某个下标i,其左子下标为2*i,其右子下标为2*i+1

在堆中两个重要的调整函数(递归写法)以大顶堆为例

(1)向上调整(插入时使用,插入时将新结点放在最后一个位置,然后向上调整)

void upadjust(int index){
	if(index==1) return;
	if(heap[index/2]<heap[index]){
		swap(heap[index],heap[index/2]);
	}
	upadjust(index/2);
}

(2)向下调整(建堆、堆排序时使用)

void downadjust(int index){
	int j=index*2;
	if(j<=N){
		if(j+1<=N&&heap[j+1]>heap[j]) j++;
	}
	if(heap[j]>heap[index]){
		swap(heap[j],heap[index]);
	}else{
		return;
	}
	downadjust(j);
}

在上面两个函数的基础上就可以解决堆的其他问题

(1)建堆:从N/2的位置开始向下调整

viod creatheap(){
    for(int i=N/2;i>=1;i--){
        downadjust(i);
    }
}

(2) 堆排序:将堆顶元素与末尾元素交换,从堆顶开始向下调整(记得修改N)

void heapsort(){
	for(int i=1;i<N;i++){	//进行N-1次 
		swap(heap[1],heap[N]);
		N--;
		downadjust(1);
	}
}

3、BST树

重要性值:

建树时采取从根结点开始的插入思想

1、对于每个结点,左边的小,右边的大(哪边取等于看题意)

2、BST树的中序就是数据从小到大的序列

其余结合树的序列转换解题

4、LCA问题

核心抓住中序来做,记录一下每个结点的中序位置,从根结点开始走(根左右的顺序),第一个中序位置在两个点中序位置之间的点,就是其最低共同祖先。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值