1. 程式人生 > >C++實現二叉樹建立、前序、中序、後序、層序遍歷

C++實現二叉樹建立、前序、中序、後序、層序遍歷

看完資料結構二叉樹部分後,通過學習書上的虛擬碼以及其他人的程式碼自己動手實現了一下,採用前序方式建立一顆二叉樹,實現了前中後層四種遍歷方式。

在層序遍歷部分與前三種遍歷不同,層序遍歷採用從根節點開始從上到下逐層遍歷,所以藉助佇列來實現,開始遍歷後,將根節點先壓入佇列,然後將左右孩子逐次壓入,然後先進先出,將front元素pop出來。

下面是程式碼

//標頭檔案宣告各成員函式
struct BiNode   //構造樹節點
{
public:
	char nodeData;
	BiNode *lchild, *rchild;
};

class Tree    
{
public:
	
	BiNode* create_node(const int &level,const string &pos);     //建立一個樹節點
	void PreOrder(BiNode *t);      //前序
	void InOrder(BiNode *t);       //中序
	void PostOrder(BiNode *t);     //後序
	void LevelOrder(BiNode *t);     //層序
	BiNode *root;                   //根節點
};

#include<queue>
//實現函式
BiNode* Tree::create_node(const int &level,const string &pos)
{
	char data;
	BiNode *node;
	cout << "請輸入資料:層數:" << level << "位置" << pos << endl;
	cin >> data;
	if (data == '0')
	{
		node = nullptr;
		return node;
		
	}
	else{
		node = new BiNode;
		node->nodeData = data;
		node->lchild = create_node(level + 1, "left");
		node->rchild = create_node(level + 1, "right");
		return node;
	}
	
}

void Tree::PreOrder(BiNode *T)
{
	if (T == nullptr)
	{
		return;
	}
	cout << T->nodeData << " ";
	PreOrder(T->lchild);
	PreOrder(T->rchild);
}

void Tree::InOrder(BiNode *T)
{
	if (T == nullptr)
	{
		return;
	}
	InOrder(T->lchild);
	cout << T->nodeData<<" ";
	InOrder(T->rchild);
}

void Tree::PostOrder(BiNode *T)
{
	if (T == nullptr)
	{
		return;
	}
	PostOrder(T->lchild);
	PostOrder(T->rchild);
	cout << T->nodeData<<" ";

}
void Tree::LevelOrder(BiNode *T)
{
	queue<BiNode*> q;          //注意標頭檔案的引用,採用了c++內部封裝的queue容器,佇列的        
    BiNode *p = new BiNode;    //各個成員函式都封裝完成
	if (T == nullptr)
	{
		return;
	}
	q.push(T);
	while (!q.empty())
	{
		p = q.front();
		cout << p->nodeData<<" ";
		q.pop();
		if (p->lchild)
		{
			q.push(p->lchild);
		}
		if (p->rchild)
		{
			q.push(p->rchild);
		}
	}
}

主函式呼叫

int main()
{
	Tree T;
	int level = 1;
	T.root = T.create_node(level, "root");
	cout << "前序遍歷" << endl;
	T.PreOrder(T.root);
	cout << endl<< "中序遍歷" << endl;
	T.InOrder(T.root);
	cout <<endl<< "後序遍歷" << endl;
	T.PostOrder(T.root);
	cout << endl<<"層序遍歷" << endl;
	T.LevelOrder(T.root);
	system("pause");
	return 0;
}

執行結果: