二叉树遍历方式——递归法

在leetcode刷题中,二叉树的遍历方法可以简单的分为深度优先遍历和广度优先遍历。深度优先遍历可使用递归,迭代法,广度优先遍历可使用二叉树层序遍历法。本文将以小白的身份记录一下递归遍历法。

在学习中,递归要按照三要素进行:

  1. 确定递归参数和返回值,在具体代码中实现,在本案例中,我们要用一个数组的方式来存储遍历的节点,所以参数需要用数组vector来存放数值,由于vec需要进行改变,所以引用的时候需要注意物理引用格式。即vector<int> & vec。

int在声明和定义变量时使用,它表示的意思是所声明或所定义的变量为整型变量。如果其用于函数参数时,其传递方向为值传递,即只能将实参的值传递给形参,而不能将形参的值传递给实参。
int&这里的&不是取地址符号,而是引用符号,引用是C++对C的一个重要补充。变量的引用就是变量的别名,讲的通俗一点就是另外一个名字.
————————————————
版权声明:本文为CSDN博主「可即」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: https://blog.csdn.net/xiaojinger_123/article/details/120453429
  1. 确定终止条件,对于二叉树来说,当遍历到没有节点的时候即终止。

  1. 确定单层递归的原理。

根据递归三要素,我们可以去leetcode查看相关题目:

根据题目要求我们写出满足上述三要求的代码:

  1. 递归要确定传递的参数和返回的数值,在该代码中,由于没有需要返回的数值,所以使用void,传递的参数则由自定的一维数组vec进行传递:

void  traversal(TreeNode * cur, vector<int>& vec)
  1. 终止逻辑:当节点为空时终止:

if(cur ==nullptr) return;
  1. 递归单层逻辑:前序遍历法是中左右进行遍历,也就是先取中节点的数值,然后取左节点和右节点的数值。中序遍历则是左中右的方式,也就是先去左节点再去中间节点和右节点,同理,后序遍历是先取左节点,然后右节点,最后中间节点。

注意,中左右可以理解为中间节点遍历顺序。遍历完后,vec放的是前序遍历后所有节点的顺序。

vec.push_back(cur-> value);
traversal(vec -> left, vec);
traversal(vec -> right ,vec);

整篇代码如下:

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;
    }
    
    

};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树遍历有三种方式:前序遍历、中序遍历和后序遍历。其非递归如下: 1. 前序遍历递归 使用栈来模拟前序遍历递归过程,先将根节点压入栈中,然后循环执行以下步骤: - 弹出栈顶节点,并打印该节点的值。 - 如果该节点有右子树,则将右子树压入栈中。 - 如果该节点有左子树,则将左子树压入栈中。 代码实现: void PreOrderTraversal(BinTree BT) { if (!BT) return; // 空树直接返回 Stack S = CreateStack(MaxSize); // 创建栈 BinTree T = BT; while (T || !IsEmpty(S)) { while (T) { printf("%d ", T->Data); // 访问节点 Push(S, T); T = T->Left; } if (!IsEmpty(S)) { T = Pop(S); T = T->Right; } } } 2. 中序遍历递归 使用栈来模拟中序遍历递归过程,先将根节点入栈,然后循环执行以下步骤: - 如果当前节点不为空,将其左子树入栈。 - 如果当前节点为空,弹出栈顶节点,并打印该节点的值,然后将其右子树入栈。 代码实现: void InOrderTraversal(BinTree BT) { if (!BT) return; // 空树直接返回 Stack S = CreateStack(MaxSize); // 创建栈 BinTree T = BT; while (T || !IsEmpty(S)) { while (T) { Push(S, T); T = T->Left; } if (!IsEmpty(S)) { T = Pop(S); printf("%d ", T->Data); // 访问节点 T = T->Right; } } } 3. 后序遍历递归 使用栈来模拟后序遍历递归过程,需要记录上一个访问的节点 LastVisit。先将根节点入栈,然后循环执行以下步骤: - 如果栈顶节点的左右子树都为空,弹出栈顶节点,并打印该节点的值,然后将 LastVisit 指向该节点。 - 如果栈顶节点的右子树不为空且未被访问过,则将右子树入栈。 - 如果栈顶节点的左子树不为空且未被访问过,则将左子树入栈。 代码实现: void PostOrderTraversal(BinTree BT) { if (!BT) return; // 空树直接返回 Stack S = CreateStack(MaxSize); // 创建栈 BinTree T = BT, LastVisit = NULL; while (T || !IsEmpty(S)) { while (T) { Push(S, T); T = T->Left; } T = Top(S); if (T->Right == NULL || T->Right == LastVisit) { Pop(S); printf("%d ", T->Data); // 访问节点 LastVisit = T; T = NULL; } else { T = T->Right; } } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值