フォーチュン左義理の基礎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;
}