二叉树前序、中序、后序遍历


三种遍历

遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。

前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点


前序遍历:abdefgc
中序遍历:debgfac
后序遍历:edgfbca


递归实现:

前序递归实现:

void preorder(bintree t){
    if(t){
        printf("%c ",t->data);
        preorder(t->lchild);
        preorder(t->rchild);
    }
}
中序和后序遍历只是把打印的位置改变下。



非递归实现

非递归算法参考:http://blog.csdn.net/zhangxiangdavaid/article/details/37115355

中序:

//中序遍历
void InOrderWithoutRecursion2(BTNode* root)
{
	//空树
	if (root == NULL)
		return;
	//树非空
	BTNode* p = root;
	stack<BTNode*> s;
	while (!s.empty() || p)
	{
		if (p)
		{
			s.push(p);
			p = p->lchild;
		}
		else
		{
			p = s.top();
			s.pop();
			cout << setw(4) << p->data;
			p = p->rchild;
		}
	}
}

前序:

//前序遍历
void PreOrderWithoutRecursion2(BTNode* root)
{
	if (root == NULL)
		return;
	BTNode* p = root;
	stack<BTNode*> s;
	while (!s.empty() || p)
	{
		if (p)
		{
			cout << setw(4) << p->data;
			s.push(p);
			p = p->lchild;
		}
		else
		{
			p = s.top();
			s.pop();
			p = p->rchild;
		}
	}
	cout << endl;
}

查找、统计个数、比较、求深度的递归实现   

参考:http://blog.csdn.net/fansongy/article/details/6798278/

猜你喜欢

转载自blog.csdn.net/kc58236582/article/details/78360747