輸出用先序遍歷創建的二叉樹是否爲完全二叉樹的判定結果

利用先序遞歸遍歷算法創建二叉樹並判斷該二叉樹是否爲完全二叉樹。完全二叉樹只能是同深度的滿二叉樹缺少最後一層倒數連續個葉子結點。先序遞歸遍歷建立二叉樹的方法爲:按照先序遞歸遍歷的思想將對二叉樹結點的抽象訪問具體化爲根據接收的數據決定是否產生該結點從而實現創建該二叉樹的二叉鏈表存儲結構。約定二叉樹結點數據爲單個大寫英文字符。當接收的數據是字符"#"時表示該結點不需要創建,否則創建該結點。最後判斷創建完成的二叉樹度是否爲完全二叉樹。需要注意輸入數據序列中的"#"字符和非"#"字符的序列及個數關係,這會最終決定創建的二叉樹的形態。

輸入

輸入爲接受鍵盤輸入的由大寫英文字符和"#"字符構成的一個字符串(用於創建對應的二叉樹)。

輸出

對應的二叉樹是否爲完全二叉樹的判斷結果。若是輸出"Y",否則輸出"N"。

樣例輸入

A##
ABC####
AB##C##
ABCD###EF##G###
A##B##
ABC##D##EG###

樣例輸出

Y
N
Y
N
Y
Y
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
	char date;
node *right, *left;
}*p;
int k;

void set(node * &p)
{
	char ch;
	cin >> ch;
	if (ch == '#')
	{
		p = NULL;
	}
	else
	{
		p   = new node;
		p->date = ch;
		p->left = NULL;
		p->right = NULL;
		set(p->left);
		set(p->right);
	}
}

void find(node *&p)
{
	if (p == NULL)
		return;
	if (p->left == NULL&&p->left == NULL)
	{
		k++;
		return;
	}
	else
	{
		find(p->left);
		find(p->right);
	}
}

int main()
{
	k = 0;
	set(p);
	queue<node*>q;
	q.push(p);
	while (!q.empty())
	{
		node *t = q.front();
		q.pop();
		if (t->left != NULL&&k == 0)
		{
			q.push(t->left);
		}
		else
		{
			if (t->left == NULL&&k == 0)
			{
				k = 1;
			}
			else
			{
				if (k == 1 && t->left != NULL)
				{
					k = 2;
					break;
				}
			}
		}
		if (t->right != NULL&&k == 0)
		{
			q.push(t->right);
		}
		else
		{
			if (t->right == NULL&&k == 0)
			{
				k = 1;
			}
			else
			{
				if (k == 1 && t->right != NULL)
				{
					k = 2;
					break;
				}
			}
		}
	}
	if (k == 2)cout << "N";
	else cout << "Y";
	return 0;
}
avg樹判定,左右高度差不能超過1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章