[力扣]144_二叉树的前序遍历

/*
给定一个二叉树,返回它的 前序 遍历。
 示例:
输入: [1,null,2,3]
   1
         2
    /
   3
输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/

方法一:常规递归方式,用C语言实现(根左右)

代码实现:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int     length  =   0       ;
int*    ret_val =   NULL    ;

void add_ele(int val)
{
    length++;
    ret_val             = (int*)realloc(ret_val,sizeof(int)*length);    /*追加动态空间*/
    ret_val[length-1]   = val;
}

void __preOrder(struct TreeNode* node)
{
    if(node==NULL)
    {
        return;
    }

    add_ele     ( node->val   );
    __preOrder  ( node->left  );
    __preOrder  ( node->right );
}

int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    if(root==NULL)
    {
        *returnSize = 0;
        return NULL;
    }

    ret_val    = malloc(sizeof(int)*1);
    length     = 1;
    ret_val[0] = root->val; /*根*/
    __preOrder(root->left); /*左*/
    __preOrder(root->right);/*右*/

    *returnSize = length;
    return ret_val;
}

提交结果:

/*
执行结果:通过
显示详情
执行用时 :4 ms, 在所有 C 提交中击败了89.42%的用户
内存消耗 :7.8 MB, 在所有 C 提交中击败了56.03%的用户
*/

方法2:迭代方法,需要栈辅助空间,改用C++

代码实现:

class Solution
{
    public:
        vector<int> preorderTraversal(TreeNode* root)
        {
            vector<int>                 pv                  ;
            stack<struct TreeNode*>     st                  ;
            TreeNode*                   working_ptr = NULL  ;

            if(root==NULL)
            {
                return pv;
            }
            st.push(root);
            while(st.empty()==false)
            {
                working_ptr = st.top();
                st.pop();
                pv.push_back(working_ptr->val);
                if(working_ptr->right!=NULL)        /*根据栈的特性,根左右---那么应该是右孩子先入栈*/
                {
                    st.push(working_ptr->right);
                }
                if(working_ptr->left!=NULL)
                {
                    st.push(working_ptr->left);
                }
            }
            return pv;
        }
};
/*
执行结果:通过
显示详情
执行用时 :8 ms, 在所有 C++ 提交中击败了63.87%的用户
内存消耗 :9 MB, 在所有 C++ 提交中击败了82.75%的用户
*/

原文地址:https://www.cnblogs.com/alimy/p/11172088.html

时间: 2024-10-09 11:01:39

[力扣]144_二叉树的前序遍历的相关文章

144_二叉树的前序遍历

目录 144_二叉树的前序遍历 描述 方法一:递归 Java 代码 方法二:非递归(使用栈) Java 代码 144_二叉树的前序遍历 描述 给定一个二叉树,返回它的前序遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 方法一:递归 Java 代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; *

力扣——N叉树的前序遍历

给定一个 N 叉树,返回其节点值的前序遍历. 例如,给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4]. class Solution { public List<Integer> res = new ArrayList<Integer>(); public List<Integer> preorder(Node root) { if(root == null) return res; res.add(root.val); for(Node child

根据二叉树的前序遍历和中序遍历重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 在二叉树的前序遍历序列中,第一个数字总是树的根结点的值.但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边.因此我们需要扫描中序遍历序列,才能找到根结点的值. 如下图所示,

已知二叉树的前序遍历结果和中序遍历结果,请重建原来的二叉树

分析的过程: 1.假设前序遍历的第一个值为a,该值就是原二叉树的根节点. 2.在中序遍历结果中查找a. 则在中序遍历中a前面的节点,就是原二叉树a节点左子树的中序遍历结果:在a后面的节点,就是原二叉树a节点右子树的中序遍历结果. 3.由第二步得到a节点左子树的节点个数为m,那么在前序遍历中a后面的m个节点即为a节点左子树的前序遍历结果: 4.由第二步得到a节点右子树的节点个数为n,那么在前序遍历中最后n个节点即为a节点右子树的前序遍历结果: 由此我们可以得到a节点左子树和右子树的前序遍历和中序遍

已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?

对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历.中序遍历和后序遍历.这三种方式是以访问父节点的顺序来进行命名的.假设父节点是N,左节点是L,右节点是R,那么对应的访问遍历顺序如下: 前序遍历    N->L->R 中序遍历    L->N->R 后序遍历    L->R->N /***************************************************************************************

用一棵二叉树的前序遍历结果和中序遍历结果还原这棵二叉树——6

输入某二叉树的前序遍历和中序遍历的结果,重建出这棵二叉树,假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出这棵满足前序遍历和中序遍历的二叉树并输出它的头结点. 对一棵二叉树前序遍历的顺序是"根结点->左结点->右结点",而中序遍历的顺序是"左结点->根节点->右结点",因此,一般的思路都是酱紫的: 前序遍历列表中,第一个数据

lintcode 容易题:Binary Tree Preorder Traversal 二叉树的前序遍历

题目: 二叉树的前序遍历 给出一棵二叉树,返回其节点值的前序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 1 2 / 3 返回 [1,2,3]. 挑战 你能使用非递归实现么? 解题: 通过递归实现,根节点->左节点->右节点 Java程序: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(in

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树

问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 在二叉树的前序遍历序列中,第一个数字总是树的根结点的值.但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边.因此我们需要扫描中序遍历序列,才能找到根结点的值. 如下图所示,