代码随想录刷题——二叉树篇(一)

94-144-145.二叉树的前中后序遍历
递归遍历

cpp 复制代码
class Solution{
public:
    # 输入输出
	void pretraversal(TreeNode* cur, vector<int>& vec){
        # 终止条件
		if(cur==NULL) return ;
        # 其中一步
		vec.push_back(cur->val);
		pretraversal(cur->left, vec);
		pretraversal(cur->right, vec);
	} 
	void midtraversal(TreeNode* cur, vector<int>& vec){
		if(cur==NULL) return ;
		midtraversal(cur->left, vec);
		vec.push_back(cur->val);
		midtraversal(cur->right, vec);
	}
	void lttraversal(TreeNode* cur, vector<int>& vec){
		if(cur==NULL) return ;
		lttraversal(cur->left, vec);
		lttraversal(cur->right, vec);
		vec.push_back(cur->val);
	}
	vector<int> preorderTraversal(TreeNode* root){
		vector<int> preans;
		vector<int> midans;
		vector<int> ltans;
		pretraversal(root, preans);
		midtraversal(root, midans);
		lttraversal(root, ltans);
		return preans;
	}
};

迭代遍历

cpp 复制代码
class Solution{
public:
	vector<int> preorderTraversal(TreeNode* root){
		stack<TreeNode*> st;
		vector<int> ans;
		if(root==NULL) return ans;
		st.push(root);
		while(!st.empty()){
			TreeNode* t=st.top();
			st.pop();
			ans.push_back(t->val);
			if(t->right) st.push(t->right);
			if(t->left) st.push(t->left);
		}
		return ans;
	}
	vector<int> inorderTraversal(TreeNode* root){
		vector<int> ans;
		stack<TreeNode*> st;
		TreeNode* cur=root;
		while(cur!=NULL || !st.empty()){
			if(cur!=NULL){
				st.push(cur);
				cur=cur->left;
			}else{
				cur=st.top();
				st.pop();
				ans.push_back(cur->val);
				cur=cur->right;
			}
		}
		return ans;
	} 
	vector<int> postorderTraversal(TreeNode* root){
		vector<int> ans;
		stack<TreeNode*> st;
		if(root==NULL) return ans;
		TreeNode* cur=root;
		st.push(root);
		while(!st.empty()){
			TreeNode* t=st.top();
			st.pop();
			ans.push_back(t->val);
			if(t->left) st.push(t->left);
			if(t->right) st.push(t->right);
		}
		reverse(ans.begin(),ans.end());
		return ans;
	} 
};

迭代的统一写法:

cpp 复制代码
class Solution{
public:
	vector<int> preorderTraversal(TreeNode* root){
		vector<int> ans;
		stack<TreeNode*> st;
		if(root!=NULL) st.push(root);
		while(!st.empty()){
			TreeNode* t=st.top();
			if(t!=NULL){
				st.pop();
				if(t->right) st.push(t->right);
				if(t->left) st.push(t->left);
				st.push(t);
				st.push(NULL);
			}else{
				st.pop();
				t=st.top();
				st.pop();
				ans.push_back(t->val);
			}
		}
		return ans;
	}
	vector<int> inorderTraversal(TreeNode* root){
		vector<int> ans;
		stack<TreeNode*> st;
		if(root!=NULL) st.push(root);
		while(!st.empty()){
			TreeNode* t=st.top();
			if(t!=NULL){
				st.pop();
				if(t->right) st.push(t->right);
				st.push(t);
				st.push(NULL);
				if(t->left) st.push(t->left);
			}else{
				st.pop();
				t=st.top();
				st.pop();
				ans.push_back(t->val);
			}
		}
		return ans;
	} 
	vector<int> postorderTraversal(TreeNode* root){
		vector<int> ans;
		stack<TreeNode*> st;
		if(root!=NULL) st.push(root);
		while(!st.empty()){
			TreeNode* t=st.top();
			if(t!=NULL){
				st.pop();
				st.push(t);
				st.push(NULL);
				if(t->right) st.push(t->right);
				if(t->left) st.push(t->left);
			}else{
				st.pop();
				t=st.top();
				st.pop();
				ans.push_back(t->val);
			}
		}
		return ans;
	}
};

其他:

(1)递归思想:

a.确定递归函数的参数返回值(输入和输出)

b.确定终止条件(走到哪停)

c.确定单层递归逻辑(自己走其中一步)

(2)递归转迭代,通常第一步应该先执行一半 ,再写循环,不然容易搞不清楚

比如前序遍历的迭代方法,就是在循环前先把头节点入栈,然后循环 <节点出栈--左右节点入栈> 的过程

(3)前序和后序的迭代是类似的,中序的迭代循环写的很精妙,涉及或条件、循环变量

a.或条件while(cur!=NULL || !st.empty())

当 <cur指针不为空> 或者 <栈不为空> 的时候循环,对应两种情况:操作 <树> 和操作 <栈> ,cur不为空就找左指针,cur为空且栈不为空就处理栈

b.循环变量cur

用cur的状态来判断进行到哪一步

(4)迭代的统一写法本质上是不同于之前,存在节点访问后再次入栈 的情况,要对这种情况的节点再入栈一个NULL空节点用于判断是否访问过

相关推荐
头发还没掉光光22 分钟前
Linux网络之IP协议
linux·运维·网络·c++·tcp/ip
狐571 小时前
2026-01-22-LeetCode刷题笔记-3507-移除最小数对使数组有序I
笔记·leetcode
充值修改昵称1 小时前
数据结构基础:B树磁盘IO优化的数据结构艺术
数据结构·b树·python·算法
燃于AC之乐1 小时前
深入解剖STL Vector:从底层原理到核心接口的灵活运用
开发语言·c++·迭代器·stl·vector·源码分析·底层原理
程序员-King.8 小时前
day158—回溯—全排列(LeetCode-46)
算法·leetcode·深度优先·回溯·递归
优雅的潮叭8 小时前
c++ 学习笔记之 chrono库
c++·笔记·学习
星火开发设计8 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
月挽清风9 小时前
代码随想录第七天:
数据结构·c++·算法
小O的算法实验室9 小时前
2026年AEI SCI1区TOP,基于改进 IRRT*-D* 算法的森林火灾救援场景下直升机轨迹规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小郭团队9 小时前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发