2020-05-26学习随笔

序言

学习随笔是本人对自己一天的自学回顾,由于本人是非科班出身,不懂很多cs的专业术语,所以难免会有些错误,望各位批评指正,本人定当悉心接受并立即改正。希望自己能够慢慢坚持下去,坚持转行的道路,坚持每天学习的输出。

刷题篇

LeetCode

1.题目

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

2.大致思路

因为对树不熟,所以第一时间只想着要遍历,但却不知道怎么遍历,服了自己。

二叉树的三种遍历方式:前序遍历,中序遍历,后序遍历。

这里明显是后序遍历。

在遍历二叉树时,还有一个重要的思想:递归

在设计递归时,一定要注意递归出口

看完这些,代码基本上就已经写完了。

3.代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int maxDepth(struct TreeNode* root){
    if(root!=NULL){    //* 一直往下搜,搜到底即没有左右子树了,即此结点为叶子结点
        int a=maxDepth(root->left);
        int b=maxDepth(root->right);
        if(a>b) return a+1;
        else return b+1;
//* 后两句代码可以简写成  return (a>b) ? a+1:b+1;
    }
    return 0;
}

4.回顾知识点

树的遍历方式总体分为两类:深度优先搜索(DFS)、广度优先搜索(BFS);

常见的 DFS : 前序遍历、中序遍历、后序遍历;
常见的 BFS : 层序遍历(即按层遍历)。

树的后序遍历 / 深度优先搜索往往利用 递归 实现。

树的层序遍历 / 广度优先搜索往往利用 队列 实现。

利用栈实现后序遍历

用两个栈完成后序遍历

一个临时栈(起回溯作用),一个结果栈

原因:一个栈无法回溯

由于后序遍历是左——右——根,所以入栈应该是根——右——左

step1:从根结点开始,将当前结点同时入临时栈和结果栈,并遍历右子树

step2:当右子树遍历结束后,弹出临时栈栈顶结点,并遍历其左子树,继续step1步骤 (这里便是不停地根——右——左的过程)

step3:当所有结点都访问完,即最后访问的树节点为空且临时栈也为空时,主算法结束,依次弹出结果栈的结点

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容