二叉树遍历的迭代算法(非递归法)

递归的实现就是每一次递归调用都把函数的局部变量、参数值和返回地址压入栈中,然后递归返回时弹出上次递归调用的各项参数,这就是递归为什么可以返回上一层位置的原因,所以可以用栈实现二叉树的遍历。

1.前序遍历

前序遍历需要处理根结点,然后将右节点加入栈,再加入左结点。

每出栈一个结点,就加入它的右孩子和左孩子。

//前序遍历 
vector<int> preorderTraversal(TreeNode* root) {
	vector<int> result;
	stack<TreeNode*> st;
	st.push(root);
	while(! st.empty()) {
		TreeNode* node = st.top();
		st.pop();
		if (node != NULL) result.push_back(node->val);
		else continue; //重新执行循环,不执行后面语句 
		st.push(node->right);
		st.push(node->left);
	}
	return result;
}

2.中序遍历

前序遍历先访问的是中间节点,处理的也是中间节点所以可以直接写出代码。但是中序遍历访问的顺序和处理的顺序不一致,在使用迭代法写中序遍历,需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。

中序遍历做法:先一直向左到底部,到最底之后开始出栈,每出栈一个就放入它的右孩子,实现代码如下:

//中序遍历
vector<int> inorderTraversal(TreeNode* root) {
	vector<int> result;
	stack<TreeNode> st;
	TreeNode* cur = root;
	while(! st.empty() || cur != NULL) {
		st.push(cur);
		cur = cur->left;
	}
	else{
		cur = st.top();
		st.pop();
		result.push_back(cur->val);
		cur = cur->right;
	}
}

3.后序遍历

前序遍历是中左右,后序遍历是左右中,调整一些前序遍历就可以变成中右左,再反转result就编程左右中,实现代码如下:

//后序遍历
vector<int> postorderTraversal(TreeNode* root) {
	vector<int> result;
	stack<TreeNode*> st;
	st.push(root);
	while(!st.empty()) {
		TreeNode* node = st.top();
		if (node!=NULL) st.pop();
		else continue;
		st.push(node->left);
		st.push(node->right);
	}
	reverse(result.begin(), result.end());
	return result;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值