バイナリツリートラバーサル
- バイナリツリーのアプリケーションは、それは多くの場合、特定の機能または処理を施し一つツリー一方のノードとツリー内のノードを見つけるために必要とされる、このプレゼント二分木をトラバースする方法の問題。
- 私たちは、パスサーチ部によると、ツリー内の各ノードを訪問したい、と各ノードがあり、一度だけアクセスされていること。「アクセス」は多くのことを意味し、そのような出力ノード情報等の各種処理のためのノードであってもよいです。構造の線形トラバーサルは、問題を解決することは容易であり、バイナリツリーは、非線形構造であるため、バイナリツリーは、そうではないため、各ノードは0-2サブツリー、したがって、法律の必要性を有していてもよく、そうノードがトラバースを容易にするために、ライン・キュー上の二分木に配置することができます。
- 私たちはここに横断する必要がある場合は最初の左と右、その後、すなわち周りの根、左と右の根、根のみ3例は、周りに、我々は先行順、前順、後順と呼ばれています。
- 画像が示す2次の2つの例、その結果をの横断後、シーケンスにおいて、最初の順序で与えられます。
- ここで行きがけ、inorderを、後順再帰的な方法私は、一例として、シーケンス内の動きを達成するために行くために使用され、コアコードがのルートである左右イデオロギー:()
void inOrder(BiTree& T)
{
if(T)
{
inOrder(T->lchild);
visit(T->data);
inOrder(T->rchild);
}
}
- ここでは、完全なバイナリツリートラバーサルの実装コードは次のようになります。
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
//二叉链表的结点结构
typedef struct BiTreeNode{
char data; //数据域
struct BiTreeNode* lchild; //左孩子指针域
struct BiTreeNode* rchild; //右孩子指针域
}BiNode,*BiTree;
void CreateBiTree(BiTree& T); //初始化添加二叉树信息
void preOrder(BiTree& T); //先序遍历二叉树:根 左 右
void inOrder(BiTree& T); //中序遍历二叉树:左 根 右
void postOrder(BiTree& T); //后序遍历二叉树:左 右 根
void CreateBiTree(BiTree& T)
{
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else
{
if(!(T=(BiNode*)malloc(sizeof(BiNode)))) exit(0);
T->data=ch;
//这里注意正确输入的顺序
CreateBiTree(T->lchild); //先构造左子树
CreateBiTree(T->rchild); //再构造右子树
}
}
int visit(char data1)
{
cout<<data1;
return 0;
}
void preOrder(BiTree& T)
{
if(T)
{
visit(T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void inOrder(BiTree& T)
{
if(T)
{
inOrder(T->lchild);
visit(T->data);
inOrder(T->rchild);
}
}
void postOrder(BiTree& T)
{
if(T)
{
postOrder(T->lchild);
postOrder(T->rchild);
visit(T->data);
}
}
int main()
{
//测试用例:
//ABE##F##C#DG###
//-+a##*b##-c##d##/e##f##
BiTree T;
CreateBiTree(T);
preOrder(T);
cout<<endl;
inOrder(T);
cout<<endl;
postOrder(T);
return 0;
}
結果は以下の通りであります: