【算法】二叉樹的創建與遍歷

【未完待續中】

(一)二叉樹結構的定義

typedef struct BiNode  
{
	char data;
	struct BiNode* lchild;
	struct BiNode* rchild;
}BiNode, *PNode;

(二)創建二叉樹

2.1 創建思想演示

              

2.2 代碼實現

void CreateTree(PNode &root) 
{
	char ch; cin >> ch;
	if (ch == '#')    //如果爲#則停止遞歸創建
	{
		root = NULL;
	}
	else
	{
		root = new BiNode();
		root->data = ch;
		CreateTree(root->lchild);
		CreateTree(root->rchild);
	}
}

(三)遞歸遍歷二叉樹

3.1 先序遍歷

void PreOrder(PNode root) //遞歸--二叉樹先序遍歷(根左右)
{
	if (root == NULL)
		return;
	cout << root->data << " ";
	PreOrder(root->lchild);
	PreOrder(root->rchild);
}

3.2 中序遍歷

void InOrder(PNode root) //遞歸--二叉樹中序遍歷(左根右)
{
	if (root == NULL)
		return;
	InOrder(root->lchild);
	cout << root->data << " ";
	InOrder(root->rchild);
}

3.3 後序遍歷

void PostOrder(PNode root)//遞歸--二叉樹後序遍歷(左右根)
{
	if (root == NULL)
		return;
	PostOrder(root->lchild);
	PostOrder(root->rchild);
	cout << root->data << " ";

(四)非遞歸遍歷二叉樹

4.1 先序遍歷

void PreTraverse(PNode root) //非遞歸--二叉樹先序遍歷
{
	if (root == NULL)
		return;

	PNode p;
	stack<PNode> sta;
	sta.push(root);

	while (!sta.empty())
	{
		p = sta.top();
		sta.pop();

		while (p)
		{
			cout << p->data << " ";
			if (p->rchild)
			{
				sta.push(p->rchild);
			}
			p = p->lchild;
		}
	}
}

4.2 中序遍歷

void InTraverse(PNode root) //非遞歸--二叉樹中序遍歷
{
	if (root == NULL)
		return;

	PNode p;
	stack<PNode> sta;
	sta.push(root);

	while (!sta.empty())
	{
		while ((p = sta.top()) && p) //先遍歷棧中結點的左孩子
		{
			sta.push(p->lchild); 
		}
		sta.pop();

		if (!sta.empty())
		{
			p = sta.top();
			sta.pop();
			cout << p->data << " ";//此時左邊已經遍歷完了
			sta.push(p->rchild); //把右孩子放進棧中,對右孩子進行中序遍歷
		}
	}
}

4.3 後序遍歷

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章