二叉木の原理と3種類の遍歴方式(C++実現)
二叉木ノードごとに最大2つのサブツリー、すなわち度<=2、秩序ツリー がある.
せいしつ二叉木のi層目には最大2^i個のノードがあり、iは0から始まる. 深さkの二叉木には2^(k+1)-1ノードまであり、kは0から始まる. 現在のノード番号がiである場合、そのサブノード(ある場合)は2 i+1および2 i+2であり、 完全二叉木
リーフノードは最大2階にのみ表示されます.いずれかのノードの場合、右側のブランチの最大階層がlである場合、左のブランチはlまたはl+1である
満二叉木
深さkで2^(k+1)-1ノードのツリー
ツリーのノード
ぜんじゅんかん遍歴
再帰的解決
スタック解決
ちゅうかんじゅんかん遍歴
再帰的解決
スタック解決
あとじゅんかん遍歴
再帰的解決
スタック解決
せいしつ
リーフノードは最大2階にのみ表示されます.いずれかのノードの場合、右側のブランチの最大階層がlである場合、左のブランチはlまたはl+1である
満二叉木
深さkで2^(k+1)-1ノードのツリー
ツリーのノード
struct BiTreeNode {
char data;
BiTreeNode *lChild;
BiTreeNode *rChild;
BiTreeNode *Parent;
};
ぜんじゅんかん遍歴
再帰的解決
void BiTree::PreTraverse(BiTreeNode *root) const {
if (root != NULL)
{
cout << root->data;
PreTraverse(root->lChild);
PreTraverse(root->rChild);
}
}
スタック解決
// , , ,
// , ,
void BiTree::PreOrderTraverse(BiTreeNode *root) const {
stack Tree;
while (!Tree.empty() || root != NULL)
{
while (root != NULL)
{
cout << root->data;
Tree.push(root);
root = root->lChild;
}
root = Tree.top();
Tree.pop();
root = root->rChild;
}
}
ちゅうかんじゅんかん遍歴
再帰的解決
void BiTree::InTraverse(BiTreeNode *root) const {
if (root != NULL)
{
InTraverse(root->lChild);
cout << root->data;
InTraverse(root->rChild);
}
}
スタック解決
// NULL ,
void BiTree::InOrderTraverse(BiTreeNode *root) const {
stack Tree;
while (!Tree.empty() || root != NULL)
{
while (root != NULL)
{
Tree.push(root);
root = root->lChild;
}
root = Tree.top();
cout << root->data;
Tree.pop();
root = root->rChild;
}
}
あとじゅんかん遍歴
再帰的解決
void BiTree::PostTraverse(BiTreeNode *root) const {
if (root != NULL)
{
PostTraverse(root->lChild);
PostTraverse(root->rChild);
cout << root->data;
}
}
スタック解決
// : ,
// , , 。
void BiTree::PostOrderTraverse(BiTreeNode *root) const {
stack Tree;
stack<int> Times; //
while (!Tree.empty() || root != NULL)
{
while (root != NULL)
{
Tree.push(root);
Times.push(0); //
root = root->lChild;
}
if (Times.top() == 1) // 2
{
cout << Tree.top()->data;
Times.pop(); //
Tree.pop();
}
else
{
root = Tree.top();
Times.top() = 1; //
root = root->rChild;
}
}
}