首页 > 其他分享 >栈的应用之二叉树的中序遍历

栈的应用之二叉树的中序遍历

时间:2024-04-04 21:32:42浏览次数:18  
标签:遍历 TreeNode struct 中序 top Stack 二叉树 root stack

中序遍历

一、实例要求

  • 给定一个二叉树的根节点 root ,返回 它的 中序 遍历
    在这里插入图片描述

二、实例分析

  • 1、首先定义了二叉树的结构 TreeNode,以及栈的结构 Stack 和相关操作;
  • 2、然后实现了中序遍历函数 inorderTraversal,在遍历过程中使用栈来辅助实现;
  • 3、最后释放了内存;

三、示例代码

/**
 * 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().
 */
// 定义栈的结构和相关操作
struct StackNode {
    struct TreeNode *node;
    struct StackNode *next;
};

struct Stack {
    struct StackNode *top;
};

void stackPush(struct Stack *stack, struct TreeNode *node) {
    struct StackNode *newNode = (struct StackNode *)malloc(sizeof(struct StackNode));
    newNode->node = node;
    newNode->next = stack->top;
    stack->top = newNode;
}

struct TreeNode *stackPop(struct Stack *stack) {
    if (stack->top == NULL) {
        return NULL;
    }
    struct TreeNode *node = stack->top->node;
    struct StackNode *temp = stack->top;
    stack->top = stack->top->next;
    free(temp);
    return node;
}

int isStackEmpty(struct Stack *stack) {
    return (stack->top == NULL);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
   // 创建一个用于存储遍历结果的数组
    int *result = (int *)malloc(100 * sizeof(int));
    *returnSize = 0;
    
    // 创建一个栈
    struct Stack *stack = (struct Stack *)malloc(sizeof(struct Stack));
    stack->top = NULL;
    
    // 遍历二叉树
    while (root != NULL || !isStackEmpty(stack)) {
        // 将当前节点及其左子节点依次入栈
        while (root != NULL) {
            stackPush(stack, root);
            root = root->left;
        }
        // 弹出栈顶节点,访问该节点的值,并将其右子节点设为当前节点
        root = stackPop(stack);
        result[(*returnSize)++] = root->val;
        root = root->right;
    }
    
    // 释放栈内存
    free(stack);
    
    return result; 
}

四、运行结果

在这里插入图片描述
在这里插入图片描述

标签:遍历,TreeNode,struct,中序,top,Stack,二叉树,root,stack
From: https://blog.csdn.net/qq_41878292/article/details/137381282

相关文章

  • 图的遍历-DFS
    1.DFS遍历DFS算法的思想:对一个无向连通图,在访问图中某一起始顶点v后,由v出发,访问它的某一邻接顶点w1;再从w1出发,访问与w1邻接但还没有访问过的顶点w2;然后再从w2出发,进行类似的访问;…;如此进行下去,直至到达所有邻接顶点都被访问过的顶点u为止;接着,回退一步,回退到前一......
  • 11.python的字典dict(下) 遍历字典,结构优化
    11.python的字典dict(下)遍历所有的键值对items()方法是字典的一个内置方法,用于返回字典中所有键值对的视图(view)。它返回一个可迭代的对象,每个元素都是一个包含键和对应值的元组。下面用一个例子来说明items()方法的用法:dict1={'name':'John','age':25,'job':'En......
  • 代码随想录算法训练营第二十一天| 530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的
    530.二叉搜索树的最小绝对差https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/TreeNodepre=null;intres=Integer.MAX_VALUE;publicintgetMinimumDifference(TreeNoderoot){if(root==null)return0;pr......
  • 二叉树的高效非递归层次遍历:一种O(n)时间复杂度与固定空间复杂度的解决方案
    @TOC在计算机科学中,二叉树是一种非常重要的数据结构,它在算法设计和问题解决中扮演着关键角色。本文将探讨如何使用非递归方法遍历一个给定的二叉树,并在不修改树结构的前提下,输出每个节点的关键字。这个过程将在O(n)的时间复杂度内完成,并且只使用固定量的额外存储空间。1.......
  • 稀碎从零算法笔记Day37-LeetCode:所有可能的真二叉树
    今天的每日一题,感觉理解的还不够深,有待加深理解题型:树、分治、递归链接:894.所有可能的真二叉树-力扣(LeetCode)来源:LeetCode题目描述给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val==0 ......
  • python 遍历字典
    在Python中,遍历字典(dictionary)通常涉及遍历字典的键(keys)、值(values)或者同时遍历键和值。以下是几种常见的遍历字典的方法:遍历字典的键(keys):pythonmy_dict={'a':1,'b':2,'c':3}forkeyinmy_dict.keys():print(key)遍历字典的值(values):pythonforvalue......
  • leetcode每日一题 1379. 找出克隆二叉树中的相同节点
    问题描述给你两棵二叉树,原始树original和克隆树cloned,以及一个位于原始树original中的目标节点target。其中,克隆树cloned是原始树original的一个副本。请找出在树cloned中,与target相同的节点,并返回对该节点的引用(在C/C++等有指针的语言中返回节点指针,其他......
  • 二叉树
    <!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <metaname="viewport"content="width=d......
  • LeetCode-1379. 找出克隆二叉树中的相同节点【树 深度优先搜索 广度优先搜索 二叉树】
    LeetCode-1379.找出克隆二叉树中的相同节点【树深度优先搜索广度优先搜索二叉树】题目描述:解题思路一:递归,由于我们比较的是节点而不是节点值(例如C++比较的是地址),所以下面的代码也适用于树中有值相同节点的情况(本题的进阶问题)。解题思路二:递归这题有几个关键点,一:判......
  • 15天【代码随想录算法训练营34期】第六章 二叉树 part02(● 层序遍历 10 ● 226.翻
    层序遍历10102.二叉树的层序遍历(opensnewwindow)#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution......