#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int data;
node *left;
node *right;
};
node* leftRotate(node* input)
{
node *temp = input->right;
input->right = temp->left;
temp->left = input;
return temp;
}
node* rightRotate(node* input)
{
node* temp = input->left;
input->left = temp->right;
temp->right = input;
return temp;
}
node* rightleft(node* input)
{
input->right = rightRotate(input->right);
return leftRotate(input);
}
node* leftright(node* input)
{
input->left = leftRotate(input->left);
return rightRotate(input);
}
int getHeight(node *input)
{
if (input == NULL) return 0;
int l = getHeight(input->left);
int r = getHeight(input->right);
return max(l, r) + 1;
}
node* inserttree(node* input,int a)//input表示原來的已經(jīng)建立的樹厨埋,a表示待插入的數(shù)
{
if (input==NULL)//如果數(shù)空,則用該數(shù)值填充
{
input = new node;
input->data = a;
}
else if (input->data > a)//如果插入節(jié)點(diǎn)的數(shù)小于根節(jié)點(diǎn)則遞歸插入左子樹
{
input->left = inserttree(input->left, a);
int l = getHeight(input->left), r = getHeight(input->right);
if (l - r >= 2)
{
if (a < input->left->data)//如果該值小于左子樹的值則右旋
{
input = rightRotate(input);
}
else
{
input = leftright(input);
}
}
}
else
{
input->right = inserttree(input->right, a);
int l = getHeight(input->left), r = getHeight(input->right);
if (r-l>=2)
{
if (a>input->right->data)
{
input = leftRotate(input);//插入的位置是右子樹的右子樹,則需要左旋即可
}
else
{
input = rightleft(input);
}
}
}
return input;
}
int isComplate = 1, after = 0;
vector<int> levelOrder(node *input)
{
vector<int> v;
queue<node *> iqueue;
iqueue.push(input);
while (!iqueue.empty())
{
node* temp = iqueue.front();
iqueue.pop();
v.push_back(temp->data);
if (temp->left!=NULL)
{
if (after)
{
isComplate = 0;
}
iqueue.push(temp->left);
}
else
{
after = 1;
}
if (temp->right != NULL)
{
if (after) isComplate = 0;
iqueue.push(temp->right);
}
else
{
after = 1;
}
}
return v;
}
int main()
{
int M, a;
cin >> M;
node* tree=nullptr;
for (int i = 0; i < M; i++)
{
cin >> a;
tree = inserttree(tree, a);
}
vector<int> v = levelOrder(tree);
for (int i = 0; i < v.size(); i++)
{
if (i!=0)
{
cout << " ";
}
cout << v[i];
}
cout << endl;
if (isComplate)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
system("pause");
return 0;
}
1123 Is It a Complete AVL Tree(30 分)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門恼蓬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沫浆,“玉大人,你說我怎么就攤上這事滚秩∽ㄖ矗” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵郁油,是天一觀的道長本股。 經(jīng)常有香客問我,道長桐腌,這世上最難降的妖魔是什么拄显? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮案站,結(jié)果婚禮上躬审,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好承边,可當(dāng)我...
- 文/花漫 我一把揭開白布遭殉。 她就那樣靜靜地躺著,像睡著了一般博助。 火紅的嫁衣襯著肌膚如雪险污。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼飒箭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜒灰?” 一聲冷哼從身側(cè)響起弦蹂,我...
- 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎强窖,沒想到半個月后凸椿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡翅溺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年脑漫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咙崎。...
- 正文 年R本政府宣布伊滋,位于F島的核電站碳却,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笑旺。R本人自食惡果不足惜昼浦,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筒主。 院中可真熱鬧竹海,春花似錦、人聲如沸全庸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至火诸,卻和暖如春锦针,著一層夾襖步出監(jiān)牢的瞬間荠察,已是汗流浹背置蜀。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長得像焕盟,于是被迫代替她去往敵國和親秋秤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- AVL樹建立模板寫好脚翘,之后層序遍歷判斷是否為完全二叉樹:在出現(xiàn)空子節(jié)點(diǎn)之后仍有非空子節(jié)點(diǎn)出現(xiàn)則不為完全二叉樹
- 審題:紅黑樹是二叉樹灼卢,所以可以直接根據(jù)先序建樹(注意小于等于放在一起)每一個節(jié)點(diǎn)到葉子結(jié)點(diǎn)的黑色的數(shù)目要相同
- 鏈表結(jié)構(gòu) 這里的頭結(jié)點(diǎn)也有val值沃于,它不是一個空節(jié)點(diǎn)涩咖。 解法一(遞歸) 運(yùn)行時間:31ms 占用內(nèi)存:688k ...
- 我想是冥冥之中的一種召喚吧? 說起我的寫作經(jīng)歷繁莹,可以說就是由寫作文檩互、寫日記和寫論文組成吧。從我小學(xué)識字開始咨演,我就開...