IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode94.二叉树的中序遍历 -> 正文阅读

[数据结构与算法]leetcode94.二叉树的中序遍历

1:递归代码

void midTraversal(struct TreeNode *root,int *ret,int *returnSize)
 {
     if(root)
     {

         midTraversal(root->left,ret,returnSize);//先中序访问左子树
         ret[(*returnSize)++]=root->val;//中序访问左子树之后,访问并计入数组根节点
         midTraversal(root->right,ret,returnSize);//最后中序访问右子树
     }
 }
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int *ret=(int *)malloc(sizeof(int)*100);
    *returnSize=0;
    midTraversal(root,ret,returnSize);
    return ret;
}

2:迭代思想

1:因为中序遍历是先处理左子树,然后处理中间节点,最后处理右子树。左右子树也是相同的处理方式。

2:其实迭代要做的只有两件事,:把延迟处理的先放入栈中,先处理的后放入栈中;要处理的弹出栈。

3:最后处理的是中间节点和右子树,应该先将右子树放入栈中,再将根节点放入栈中,但是右子树明显是可以用根节点表示的,如果我们只将根节点放入栈中,当根节点出栈处理的时候,将用根节点表示的右子树放入栈中,是不是也达到了先处理根节点,再处理右子树的目的。

4:我们应该最后将左子树放入栈中(注意左子树用左子树的根节点代替),现在栈顶是左子树的根节点,其实将左子树视为一个新的树New,放入左子树的根节点,是不是相当于将新树New的根节点和右子树放入栈了,现在再放入新树New的左子树再放入栈是不是就行了,现在栈顶的节点又可以视为一个新的树的根节点和右子树,在将其左子树放入就行,以此类推。(空节点永远不入栈)。

5:注:栈中的每一个节点都视为根节点和右子树,弹出后先处理完根节点,再将用根节点表示的右子树入栈,这样就达到了左,中,右的处理顺序。

int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int *ret=(int *)malloc(sizeof(int)*101);
    *returnSize=0;
    struct TreeNode *stack[100];
    int top=0;
    if(root==NULL)
    {
        return ret;
    }
    stack[0]=root;
    while(top>=0)
    {
        while(stack[top]->left!=NULL)//向左走到尽头
        {
            struct TreeNode *temp= stack[top]->left;
            stack[++top]=temp;
        }
        while(top>=0)
        {
        struct TreeNode *temp1= stack[top--];//弹出的节点就是要放入数组的节点
        ret[(*returnSize)++]=temp1->val;
        if(temp1->right!=NULL)
        {//如果弹出的节点右子树不为空,则按上面的循环继续处理
            stack[++top]=temp1->right;
            break;
        }
        }
    }
    return ret;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:09:33  更:2021-11-27 10:10:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 14:25:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码