二叉树的前序/中序/后序遍历—采用递归与迭代两种方法实现嗷

简介: 二叉树的前序/中序/后序遍历—采用递归与迭代两种方法实现嗷

二叉树的前序/中序/后序遍历—采用递归与迭代两种方法实现(以leetcode二叉树遍历为例题)


前序遍历


递归算法


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = 0;
    int * returns = (int *)malloc(sizeof(int)* 110);
    preorder(root,returns,returnSize);
    return returns;
}
void preorder(struct TreeNode* root,int returns[],int *returnSize)
{
    if(root == NULL)
    {   
        return;
    }
    // printf("%d",root->val);
    // preorder(root,returns,&returnSize);
    returns[*returnSize] = root->val;
    (*returnSize)++;
    preorder(root->left,returns,returnSize);
    preorder(root->right,returns,returnSize);
}


迭代


这里比较详细🔎(复杂)的写出来,包括栈的存储方式定义,入栈,出栈,判空以及初始化方法,下面中序与后序遍历时进行了优化!减少了多个方法函数!

::重点记忆后边的写法::

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
typedef struct stack{
    struct TreeNode* data[110];
    int top;
}stack;
void push(stack *s,struct TreeNode *x)
{
    s->data[(s->top)] = x;
    (s->top)++;
}
struct TreeNode *pop(stack *s,struct TreeNode *x)
{
    x = s->data[--(s->top)];
    // printf("%d",x->val);
    return x;
}
void init(stack *s)
{
    (s->top) = 0;
}
int empty(stack s)
{
    if(s.top == 0)
        return 0;
    return 1;
}
void visit(struct TreeNode* x,int returns[],int *returnSize)
{
    returns[(*returnSize)++] = x->val;
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = 0;
    int* returns = (int *)malloc(sizeof(int)* 110);
    struct TreeNode *m;
    m = root;
    stack s;
    init(&s);
    while(m != NULL || empty(s)!= 0)
    {
        if(m)
        {
            visit(m,returns,returnSize);
            push(&s,m);
            // printf("s%ds",m->val);
            m = m->left;
        }
        else
        {
            m = pop(&s,m);
            m = m->right;
        }
    }
    return returns;
}


中序遍历


递归算法


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = 0;
    int *returns = (int *)malloc(sizeof(int )* 110);
    inorder(root,returns,returnSize);
    return returns;
}
void inorder(struct TreeNode* root,int returns[],int *returnSize)
{
    if(root == NULL)
        return;
    inorder(root->left,returns,returnSize);
    returns[(*returnSize)++] = root->val;
    inorder(root->right,returns,returnSize);
}


迭代


我们也可以用迭代的方式实现递归函数,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,其余的实现与细节都相同,代码附下。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = 0;
    int* returns = (int *)malloc(sizeof(int )*110);
    struct TreeNode *s[110];
    int top = 0;
    struct TreeNode *m = root;
    while(m!=NULL || top != 0)
    {
        if(m)
        {
            s[top++] = m;
            m = m->left;
        }
        else
        {
            m = s[--top];
            returns[(*returnSize)++] = m->val;
            m = m -> right;
        }
    }
    return returns;
}


后序遍历


递归


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* postorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = 0;
    int *returns = (int *)malloc(sizeof(int)* 110);
    postorder(root,returns,returnSize);
    return returns;
}
void postorder(struct TreeNode* root,int returns[],int *returnSize)
{
    if(root == NULL)
    {
        return;
    }
    postorder(root->left,returns,returnSize);
    postorder(root->right,returns,returnSize);
    returns[(*returnSize)++] = root->val;
}


迭代 (卡了一会儿)


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* postorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = 0;
    int *returns = (int *)malloc(sizeof(int)* 110);
    struct TreeNode* data[110];
    int top = 0;
    struct TreeNode* m = root;
    struct TreeNode* pre = NULL;
    while(m || top != 0)
    {
        while(m)
        {
            pre = m;
            data[top++] = m;
            m = m->left;
        }
        m = data[--top]; //当前m为空,肯定要m找到上一个结点,才能判断
        if(m->right != NULL && m->right != pre) //下面还有子结点
        {
            data[top++] = m;
            m = m->right;
        }
        else
        {
            pre = m;  //pre记录现在的结点 当m->right与pre相等时可以记录当前结点
            returns[(*returnSize)++] = pre->val;
            m = NULL; //m去栈里找栈顶元素
        }   
    }
    return returns;
}
相关文章
|
Web App开发 安全 iOS开发
TrollStore巨魔商店永久安装APP 可实现IOS应用双开 安装任意APP
TrollStore 是一个永久签名的监禁应用程序,可以永久安装您在其中打开的任何 IPA。
15480 0
|
机器学习/深度学习 PyTorch API
PyTorch 深度学习实用指南:6~8
PyTorch 深度学习实用指南:6~8
393 0
|
前端开发 数据库 Python
Python Web 开发: 解释 Django 框架的 MVC 架构是什么?
Python Web 开发: 解释 Django 框架的 MVC 架构是什么?
582 0
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
人工智能 JavaScript 前端开发
高效方便管理多版本Node(windows方式)
高效方便管理多版本Node(windows方式)
945 2
高效方便管理多版本Node(windows方式)
|
消息中间件 存储 Linux
linux实时应用如何printf输出不影响实时性?
本文探讨了Linux实时任务中为何不能直接使用`printf(3)`,并介绍了实现不影响实时性的解决方案。实时任务的执行时间必须确定且短,但`printf(3)`的延迟取决于多个因素,包括用户态glibc缓冲、内核态TTY驱动和硬件。为确保实时性,通常将非实时IO操作交给低优先级任务处理,通过实时进程间通信传递信息。然而,即使这样,`printf(3)`在glibc中的实现仍可能导致高优先级任务阻塞。Xenomai 3提供了一个实时的`printf()`实现,通过libcobalt库在应用编译链接时自动处理,预分配内存,使用共享内存和线程特有数据来提高效率和实时性。
1269 0
linux实时应用如何printf输出不影响实时性?
|
人工智能 算法
直接使用大模型面临的问题
【1月更文挑战第20天】直接使用大模型面临的问题
1299 4
直接使用大模型面临的问题
|
编解码 前端开发
什么是适配?
什么是适配?
|
存储 Python
如何使用Python实现“猜数字”游戏
本文介绍了使用Python实现“猜数字”游戏的过程。游戏规则是玩家在给定范围内猜一个由计算机随机生成的整数,猜对则获胜。代码中,首先导入random模块生成随机数,然后在循环中获取玩家输入并判断大小,提供猜小、猜大提示。通过增加猜测次数限制、难度选择、优化输入提示和图形化界面等方式可优化游戏。这篇文章旨在帮助初学者通过实际操作学习Python编程。
1398 2
|
弹性计算 大数据 测试技术
2024年阿里云服务器新购、续费、升级优惠信息整理汇总
随着云计算技术的深入普及,越来越多的企业和个人选择阿里云作为他们的云服务提供商。然而,续费成本往往成为用户考虑的重要因素。为了帮助用户更经济地续费,阿里云推出了一系列优惠活动和代金券。2024年阿里云服务器优惠活动,轻量2核2G3M服务器61元一年、2核4G4M带宽165元1年,云服务器4核16G10M带宽26元1个月、149元半年,阿里云ECS云服务器2核2G3M新老用户均可99元一年续费不涨价,企业用户2核4G5M带宽199元一年
3224 2

热门文章

最新文章