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

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

题目

  • 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
欢迎来踩~~~~


猜你喜欢

转载自blog.csdn.net/w7239/article/details/85036913