二叉树的深度优先遍历(递归法)

二叉树的结构体定义:

struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode() : val(0), left(nullptr), right(nullptr) {}
      TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
      TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  };

下面是递归法的思路步骤,主要分为三步:

1. 确定递归函数的参数和返回值:

确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

2. 确定终止条件:

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终⽌条件或者终止条件写的不对,操作系统也是用⼀个栈的结构来保存每⼀层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

3. 确定单层递归的逻辑:

确定每⼀层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程

  • 前序遍历:中左右
  • 中序遍历:左中右
  • 后序遍历:左右中

单层递归的逻辑就是按照中左右的顺序来处理的,这样二叉树的前序遍历,基本就写完了。

前序遍历:

class Solution {
public:
 void traversal(TreeNode* cur, vector<int>& vec) {
		 if (cur == NULL) return;
		 vec.push_back(cur->val); // 中
		 traversal(cur->left, vec); // 左
		 traversal(cur->right, vec); // 右
	 }
	 vector<int> preorderTraversal(TreeNode* root) {
		 vector<int> result;
		 traversal(root, result);
		 return result;
	 }
};

前序遍历写出来之后,中序和后序遍历就不难理解了,代码如下:

中序遍历:

void traversal(TreeNode* cur, vector<int>& vec) {
	 if (cur == NULL) return;
	 traversal(cur->left, vec); // 左
	 vec.push_back(cur->val); // 中
	 traversal(cur->right, vec); // 右 
 }

后序遍历:

void traversal(TreeNode* cur, vector<int>& vec) {
	 if (cur == NULL) return;
	 traversal(cur->left, vec); // 左
	 traversal(cur->right, vec); // 右
	 vec.push_back(cur->val); // 中 
 }

最后,可以做一做Leetcode上的三道题来练练手呀 O(∩_∩)O~

  • 144.⼆叉树的前序遍历
  • 145.⼆叉树的后序遍历
  • 94.⼆叉树的中序遍历
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值