代码随想录 | 144 145 94 二叉树的遍历

二叉树的递归遍历

递归遍历相对简单,直接给出代码实现

前序遍历

void traversal(TreeNode* root,vector<int>& vec) {
	if (root == nullptr)
		return;
	vec.push_back(root->val);
	traversal(root->left,vec);
	traversal(root->right,vec);
}
vector<int> preorderTraversal(TreeNode* root) {
	vector<int> result;
	traversal(root, result);
	return result;
}

中序遍历

void traversal(TreeNode* root,vector<int>& vec) {
	if (root == nullptr)
		return;
	traversal(root->left,vec);
    vec.push_back(root->val);
	traversal(root->right,vec);
}

后序遍历 

void traversal(TreeNode* root,vector<int>& vec) {
	if (root == nullptr)
		return;
    vec.push_back(root->val);
	traversal(root->right,vec);
    traversal(root->left,vec);
}

二叉树的迭代遍历

迭代法就是利用栈来实现二叉树的遍历

前序遍历

先处理根节点,再处理左子树,再处理右子树

代码实现思路是,先让根节点入栈,然后处理根节点,根节点出栈,然后让右子树入栈,再让左子树入栈,再出栈处理,循环这个过程。整个过程是一边处理,一边访问的。

代码实现

vector<int> preorderTraversal(TreeNode* root) {
	vector<int> result;
	stack<TreeNode*> st;
	if (root == nullptr)
		return result;
	st.push(root);//根节点入栈
	TreeNode* node = nullptr;
	while (!st.empty()) {
		node = st.top();
		result.push_back(node->val);//处理
		st.pop();
		if (node->right) st.push(node->right);//右子树入栈,先入栈才能后出栈
		if (node->left) st.push(node->left);//左子树入栈
	}
	return result;
}

后序遍历

前序遍历的顺序是 根左右 ,后续遍历的顺序是 左右根 。我们只需要改变入栈顺序,先让前序遍历变成 根右左,再反转一下,就得到了 左右根。

代码实现

vector<int> postorderTraversal(TreeNode* root) {
	vector<int> result;
	stack<TreeNode*> st;
	TreeNode* node = nullptr;
	if (root == nullptr)
		return result;
	st.push(root);
	while (!st.empty()) {
		node = st.top();
		result.push_back(node->val);
		st.pop();
		if (node->left) st.push(node->left);//先变成根右左
		if (node->right) st.push(node->right);
	}
	reverse(result.begin(), result.end());
	return result;
}

中序遍历

中序遍历的顺序是 左根右,与前序遍历不同的是,它不能一边处理一边访问,因为它要先访问到整个二叉树最左下角的节点,才能开始处理。

代码实现

vector<int> inorderTraversal(TreeNode* root) {
	vector<int> result;
	stack<TreeNode*> st;
	TreeNode* node = root;
	while (node || !st.empty()) {
		if (node) {//这个if的作用,找到最左下的节点,处理左子树
			st.push(node);//不断找左子树,直到左子树为空,此时访问这个左子树为空的二叉树的根节点
			node = node->left; 
		}
		else {
			node = st.top();
			result.push_back(node->val);//处理根节点
			st.pop();
			node = node->right;//访问右子树
		}
	}
	return result;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值