参考柳婼大神的博客:https://blog.csdn.net/liuchuo/article/details/53561924
如何判断一颗树是否是完全二叉树?层次遍历,判断出现了一个孩子为空的结点之后是否还会出现孩子结点不为空的结点。
如图所示,上图是一个RR型的旋转。
#include <stdio.h>
#include <queue>
#include <malloc.h>
using namespace std;
struct Node
{
int num;
struct Node *lchild, *rchild;
};
//插入最小不平衡结点root的右子树的右子树
Node *LL(Node *root)
{
Node *tmp = root->rchild;
root->rchild = tmp->lchild;
tmp->lchild = root;
return tmp;
}
//插入最小不平衡结点root的左子树的左子树
Node *RR(Node *root)
{
Node *tmp = root->lchild;
root->lchild = tmp->rchild;
tmp->rchild = root;
return tmp;
}
//插入最小不平衡结点root的左子树的右子树
//先对root->lchild做LL,之后对root做RR
Node *LR(Node *root)
{
root->lchild = LL(root->lchild);
return RR(root);
}
//插入最小不平衡结点root的右子树的左子树
//先对root->rchild做RR,之后对root做LL
Node *RL(Node *root)
{
root->rchild = RR(root->rchild);
return LL(root);
}
int getH(Node *root)
{
if(root == NULL) return 0;
int l = getH(root->lchild);
int r = getH(root->rchild);
return l > r? l+1 : r+1;
}
Node *insert(Node *root, int v)
{
if(root == NULL)
{
root = (Node *)malloc(sizeof(Node));
root->lchild = root->rchild = NULL;
root->num = v;
}
else
{
if(root->num > v)
{
root->lchild = insert(root->lchild, v);
int lh = getH(root->lchild), rh = getH(root->rchild);
if(lh - rh >= 2)
{
//插入左子树的左子树
if(root->lchild->num > v)
root = RR(root);
else //插入左子树的右子树
root = LR(root);
}
}
else
{
root->rchild = insert(root->rchild, v);
int lh = getH(root->lchild), rh = getH(root->rchild);
if(rh - lh >= 2)
{
//插入右子树的右子树
if(root->rchild->num < v)
root = LL(root);
else //插入右子树的左子树
root = RL(root);
}
}
}
return root;
}
queue<Node*> q;
bool leOrder(Node *root)
{
bool flag = false, isComplete = true;
Node *tmp;
q.push(root);
while(!q.empty())
{
tmp = q.front();
q.pop();
if(tmp == root)
printf("%d", tmp->num);
else
printf(" %d", tmp->num);
if(tmp->lchild)
{
q.push(tmp->lchild);
if(flag)
isComplete = false;
}
else
flag = true;
if(tmp->rchild)
{
q.push(tmp->rchild);
if(flag)
isComplete = false;
}
else
flag = true;
}
printf("\n");
return isComplete;
}
int main()
{
int n, k;
scanf("%d", &n);
Node *root = NULL;
for(int i = 0; i < n; i++)
{
scanf("%d", &k);
root = insert(root, k);
}
if(leOrder(root))
printf("YES\n");
else
printf("NO\n");
return 0;
}