二叉樹遍歷(遞歸、非遞歸,層次遍歷(從上往下))

遞歸算法

void preorder1(Node *root) //遞歸前序遍歷
{
	if (root == NULL) return;
	printf("%d ", root->val);
	preorder1(root->left);
	preorder1(root->right);
}

void inorder1(Node *root) //遞歸中序遍歷
{
	if (root == NULL) return;
	inorder1(root->left);
	printf("%d ", root->val);
	inorder1(root->right);
}

void postorder1(Node *root) //遞歸後序遍歷
{
	if (root == NULL) return;
	postorder1(root->left);
	postorder1(root->right);
	printf("%d ", root->val);
}

棧模擬非遞歸算法。遞歸算法本質上就是利用編譯器實現棧的操作。


void preorder2(Node *root)//非遞歸前序遍歷
{
	if (root == NULL) return;

	stack<Node *> stk;
	stk.push(root);
	while (!stk.empty())
	{
		Node *p = stk.top(); stk.pop();
		printf("%d ", p->val);
		if (p->right) stk.push(p->right);
		if (p->left) stk.push(p->left);
	}
}

void postorder2(Node *root)//非遞歸後序遍歷,利用兩個棧
{
	if (root == NULL) return;

	stack<Node *> stk, stk2;
	stk.push(root);
	while (!stk.empty())
	{
		Node *p = stk.top(); stk.pop();
		stk2.push(p);
		if (p->left) stk.push(p->left);
		if (p->right) stk.push(p->right);
	}
	while(!stk2.empty())
	{
		printf("%d ", stk2.top()->val);
		stk2.pop();
	}
}
void inorder2(Node *root)//非遞歸中序遍歷
{
	stack<Node *> stk;
	Node *p = root;
	while (p != NULL || !stk.empty())
	{
		if (p != NULL)
			stk.push(p), p = p->left;
		else
		{
			p = stk.top(); stk.pop();
			printf("%d ", p->val);
			p = p->right;
		}
	}
}

層次遍歷,即從上往下遍歷,利用一個隊列。

void uptodown(Node *root)
{
	if(root == NULL)
		return;
	queue<Node *> Q;
	Q.push(root)
	while(!Q.empty())
	{
		Node *p = Q.front();
		printf("%d ",p->value);
		Q.pop();
		Q.push(p->left);
		Q.push(p->right);
	}
}



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