其他分享
首页 > 其他分享> > 二叉树专题

二叉树专题

作者:互联网

Complete Binary Search Tree (30)

Link
这道题相当于是已知完全二叉排序树的中序遍历,要输出其层序遍历。做法很巧妙,根本不用建树。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <cmath>
#include <unordered_set>
using namespace std;
int n,cur;
int a[1010],b[1010];
void levelTraverse(int r){
	if(r<=n){
		levelTraverse(r<<1);
		b[r]=a[++cur];
		levelTraverse((r<<1)+1);
	}
}
int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]);
	sort(a+1,a+1+n);
	levelTraverse(1);
	for(int i=1;i<n;++i)
		printf("%d ",b[i]);
	printf("%d\n",b[n]);
	return 0;
}

Root of AVL Tree (25)

Link
AVL模板题

借用网上的图在此解释一下4种旋转的情形:(左右图都是不平衡的AVL)

先左旋后右旋指的是先左旋左子树,后右旋根节点。实际上左子树是平衡的,但是左孩子(左子树的根节点)满足两边高度之差等于1,这就导致了根节点不平衡。如果左孩子的右子树高度比左子树高度大1,那么就要先左旋以左孩子为根节点的左子树(这就会让新的左孩子的左子树高度比右子树高度大1);如果左孩子的左子树高度比右子树高度大1,那么就不必进行任何操作。也就是说,这种情况下首先要让长度的不平衡集中到左孩子的左边,最后将根节点右旋即可。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <cmath>
using namespace std;
struct node{
	int val;
	struct node *left,*right;
};
//return root
//左旋的情况:根节点所在的树不平衡
node *rotateLeft(node *root){
	node *t=root->right;
	root->right=t->left;
	t->left=root;
	return t;
}
node *rotateRight(node *root){
	node *t=root->left;
	root->left=t->right;
	t->right=root;
	return t;
}
//先左旋后右旋的情况:先左旋左子树,后右旋根节点
//左子树平衡,但左子树的两边高度差是1,导致了根节点不平衡
node *rotateLeftRight(node *root){
	//先在左子树上完成左旋
	root->left=rotateLeft(root->left);
	//后右旋根节点
	return rotateRight(root);
}
node *rotateRightLeft(node *root){
	root->right=rotateRight(root->right);
	return rotateLeft(root);
}
int getHeight(node *root){
	if(root==NULL) return 0;
	return max(getHeight(root->left),getHeight(root->right))+1;
}
node *insert(node *root,int val){
	if(root==NULL){
		root=new node();
		root->val=val;
		root->left=root->right=NULL;
	}else if(val<root->val){
		root->left=insert(root->left,val);
		if(getHeight(root->left)-getHeight(root->right)==2)
			root=val<root->left->val?rotateRight(root):rotateLeftRight(root);
	}else{
		root->right=insert(root->right,val);
		if(getHeight(root->right)-getHeight(root->left)==2)
			root=val<root->right->val?rotateRightLeft(root):rotateLeft(root);
	}
	return root;
}
int main() {
	int n,val;
	scanf("%d",&n);
	node *root=NULL;
	for(int i=1;i<=n;++i){
		scanf("%d",&val);
		root=insert(root,val);
	}
	printf("%d\n",root->val);
	return 0;
}

标签:node,左子,专题,right,二叉树,include,root,left
来源: https://www.cnblogs.com/preccrep/p/16398174.html