フォーチュン左義理の基礎class4-タイトル7-2は、木が完全2分木であるかどうかを判断します

1.タイトル:木が完全2分木であるかどうかを判断します

ここに画像を挿入説明

2.予備知識:レイヤートラバーサルにより、

ここに画像を挿入説明
完全なバイナリツリーを使用する必要が決定されたトラバース配列であるので、最初の下位トラバーサルを説明し、層におけるトラバース結果は5,3,8,2,4,6,10,7図です。

(1)アイデア

ストレージに使用キュー、最初のノード最初のキューで、キューがある場合には空でないチームの最初のノードはそれぞれ、キューに子供の周りに、その後、キューのうち最初のチーム。

(2)コアコード

void SeqTraverse(Tree *head)
{
	queue<Tree*> t;
	if(head == NULL)
		return; 
	t.push(head);//头节点进队列
	while(!t.empty())
	{
		head = t.front();
		cout<<t.front()->val<<" "; 
			
		//队首的左右孩子入队列
		if(head->left!=NULL)
			t.push(head->left);
		if(head->right!=NULL)
			t.push(head->right);
		t.pop();
	}
}

(3)完全なコード

#include<iostream>
#include<queue>
using namespace std;

//结构体定义
class Tree
{
public:
	int val;
	Tree *left;
	Tree *right;
	Tree(int x){
		this->val = x;
		this->left = NULL;
		this->right = NULL;
	}
};
//按层遍历
void SeqTraverse(Tree *head)
{
	queue<Tree*> t;
	if(head == NULL)
		return; 
	t.push(head);//头节点进队列
	while(!t.empty())
	{
		head = t.front();
		cout<<t.front()->val<<" "; 
			
		//队首的左右孩子入队列
		if(head->left!=NULL)
			t.push(head->left);
		if(head->right!=NULL)
			t.push(head->right);
		t.pop();//出队
	}
}

int main()
{
	Tree *head = new Tree(5);
	head->left = new Tree(3);
	head->left->left = new Tree(2);
	head->left->right = new Tree(4);
	head->right = new Tree(8);
	head->right->left = new Tree(6);
	head->right->right = new Tree(10);
	head->right->left->right= new Tree(7);

	SeqTraverse(head);
	system("pause");
	return 0; 
}

3.判断の完全なバイナリツリー

(1)アイデア

ツリーはシーケンスを横断することにより、各ノードのために、その後、空でない場合は全体的なアイデアは、木が空の場合は、直接trueを返すことです
現在のノードが左と右の子サブツリーを持っていない場合は①必ずしも完全なバイナリツリーではない
ノードでない場合②全児童について(子供が空のままにされていない、右の子供たちが空である、または子供について空である)ノードが葉ノード(周りの子を持たない)された後のノード。
完全①②は完全2分木で満たします。

(2)コアコード

オープン1を表す上記裁判官はリーフノードステージ、葉ブール変数の使用がオンとみなし、すべてではない子供うとしていること②、2は開きません。一般に、2つのケースが直接返さ偽あります決定する段階に入った後、葉があればhead->left != NULL || head->right != NULL約子の存在しないリーフノードを示し、戻り偽同様の場合、head->left == NULL && head->right != NULL左側が存在しない場合場合もあり、即ち右がfalseを返します。ここで組み合わせコードの両方

//开启叶子节点阶段后,若后续节点不是叶子节点返回false
//没开启时,右孩子有左孩子无,返回false
if(leaf && (head->left != NULL || head->right != NULL)
	||  
	head->left == NULL && head->right != NULL)
	return false;

ときにオープンリーフノードのステージ?
子供約4例の合計は、Aは、左と右が、Bは、Cが残っていないと権利がない、Dが残っていないと右全くないが、右せずに放置しました。Cは、リーフノードが入ると判定されたバイナリ状況、B、Dステージではない通常のキューは、
Bを、Dは場合で書くことができif(head->left == NULL || head->right == NULL)、それは権利が存在しない場合にはステージにリーフノードを決定するように要約することができます。

if(head->right != NULL)
	q.push(head->right);
else //等价于if(head->left == NULL || head->right == NULL)
	leaf = true;

次のように全体の完全なバイナリ機能を分析することです。

bool isCBT(Tree *head)
{
	if(head == NULL)
		return true;
	queue<Tree *>q;
	bool leaf = false;
	q.push(head);
	while(!q.empty())
	{
		head = q.front();
		
		//开启叶子节点阶段后,若后续节点不是叶子节点返回false
		//没开启时,右孩子有左孩子无,返回false
		if(leaf && (head->left != NULL || head->right != NULL)
			||  
			head->left == NULL && head->right != NULL)
			return false;
		if(head->left != NULL)
			q.push(head->left);
		if(head->right != NULL)
			q.push(head->right);
		else //等价于if(head->left == NULL || head->right == NULL)
			leaf = true;
		q.pop();
	}
	return true;
}

(3)完全なコード

#include<iostream>
#include<queue>
using namespace std;

class Tree
{
public:
	int val;
	Tree *left;
	Tree *right;
	Tree(int x){
		this->val = x;
		this->left = NULL;
		this->right = NULL;
	}
};

bool isCBT(Tree *head)
{
	if(head == NULL)
		return true;
	queue<Tree *>q;
	bool leaf = false;
	q.push(head);
	while(!q.empty())
	{
		head = q.front();

		//开启叶子节点阶段后,若后续节点不是叶子节点返回false
		//没开启时,右孩子有左孩子无,返回false
		if(leaf && (head->left != NULL || head->right != NULL)
			||  
			head->left == NULL && head->right != NULL)
			return false;
		if(head->left != NULL)
			q.push(head->left);
		if(head->right != NULL)
			q.push(head->right);
		else //等价于if(head->left == NULL || head->right == NULL)
			leaf = true;
		q.pop();
	}
	return true;
}

int main()
{
	Tree *head = new Tree(5);
	head->left = new Tree(3);
	head->left->left = new Tree(2);
	head->left->right = new Tree(4);
	head->right = new Tree(8);
	head->right->left = new Tree(6);
	head->right->right = new Tree(10);


	//test
	head->right->left->left= new Tree(7);
	head->right->left->right= new Tree(7);
	//head->right->right->left= new Tree(7);
	//head->right->right->right= new Tree(7);
	head->left->left->left= new Tree(7);
	head->left->left->right= new Tree(7);
	head->left->right->left= new Tree(7);
	head->left->right->right= new Tree(7);

	cout<<isCBT(head);

	system("pause");
	return 0; 
}
公開された51元の記事 ウォンの賞賛1 ビュー1371

おすすめ

転載: blog.csdn.net/shi_xiao_xuan/article/details/104050660