数据结构------后序遍历,不用栈实现和用栈实现

树的类:

//树的节点
struct Node
{
	Node(int v = 0) :val(v),left(nullptr),right(nullptr) {};
	int val;
	Node *left;
	Node *right;
};

递归:

//后序遍历----递归
void postorder_recursion(Node *node)
{
	if (node)
	{
		if (node->left)
			postorder_recursion(node->left);
		if (node->right)
			postorder_recursion(node->right);
		cout << node->val << "  ";

	}
}

非递归,用栈实现:

//后序遍历----循环
 void postorder_stack(Node* root) {
	if (!root) return;
	stack<Node*> postorder_s;
	Node* current = root;
	postorder_s.push(current);
	postorder_s.push(current); // 每个结点 push 两次,这样可以简单的判断出哪些结点是否处理过
	while (!postorder_s.empty()) {
		current = postorder_s.top();
		postorder_s.pop();
		if (!postorder_s.empty() && current == postorder_s.top()) {	//当处理过了,那么就不会再次进行孩子压栈了
			if (current->right) {
				postorder_s.push(current->right);
				postorder_s.push(current->right);
			}
			if (current->left) {
				postorder_s.push(current->left);
				postorder_s.push(current->left);
			}
		}
		else {
			cout<<current->val<< "  ";
		}
	}
}

 

下面是一种很好的思路:

//树的后序遍历   左右中
//因为先序遍历是中左右,如果将左右子树调个存,则就是中右左,然后将其不打印,存入栈中,
//正好是逆序输出,为左右中
void tail_sort(TreeNode<int> *head)
{
	if (head)	return;
	stack< TreeNode<int>*>	pri;
	stack< TreeNode<int>*>	inv_pri;
	pri.push(head);
	inv_pri.push(head);
	while (!pri.empty())
	{
		TreeNode<int>* node = pri.top();
		pri.pop();
		if (node->right) {
			pri.push(node->right);
			inv_pri.push(node->right);
		}
		if (node->left) {
			pri.push(node->left);
			inv_pri.push(node->left);
		}
	}
	while (!inv_pri.empty())
	{
		cout << inv_pri.top()->val << endl;
		inv_pri.pop();

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值