二叉树遍历(前序)(递归+非递归)

题目

  • Binary Tree Preorder Traversal

Given a binary tree, return the preorder traversal of its nodes’ values.
For example:
Given binary tree{1,#,2,3},

return[1,2,3].
Note: Recursive solution is trivial, could you do it iteratively?

题目大意

给定一棵二叉树,实现二叉树的前序遍历。

递归思想

思路

二叉树前序遍历的递归思想实现。顺序为:根 → 左 → 右。

代码

/*
* 二叉树前序遍历
*/
vector<int> preorderTraversal(TreeNode *root)
{
    vector<int> v;
    help_fun(v, root);
    return v;
}
/*
* 前序遍历顺序为:根 → 左 → 右
*/
void help_fun(vector<int> &v, TreeNode *root)
{
    if(root == NULL)return;
    v.push_back(root->val); // 保存根节点的值
    help_fun(v, root->left); // 递归遍历左子树
    help_fun(v, root->right); // 递归遍历右子树
}

非递归思想

思路

非递归方法入栈的时候先压右子树,因为用的是栈,栈是后进先出,在循环中,先保存当前根结点,然后分别将当前结点的右、左结点入栈,出栈时先出左结点,这样就能继续遍历左结点的孩子结点。就实现了二叉树的前序遍历,即:根 → 左 → 右。

get(root -> val);// 根
inorder(root -> left);// 左子树
inorder(root -> right);// 右子树

代码

/*
* 模拟 根 → 左 → 右 遍历
*/
vector<int> preorderTraversal(TreeNode *root)
{
    vector<int > v;
    stack<TreeNode* > s;
    if(root == NULL)return v;
    s.push(root);
    while(!s.empty())
    {
        TreeNode *cur;
        cur = s.top();
        s.pop();
        v.push_back(cur->val); // 保存根节点
        if(cur->right != NULL)
            s.push(cur->right); // 压入右结点
        if(cur->left != NULL)
            s.push(cur->left); // 压入左结点
    }
    return v;
}

以上。


版权声明:本文为博主原创文章,转载请注明出处。
个人博客地址:https://yangyuanlin.club
欢迎来踩~~~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值