从"按层次输出二叉树"到"求解二叉树深度"的总结

本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/41964669

最近在刷LettCode上的算法题,发现好多题目的解题思路大体是一致的,甚至会出现一解对多题的情形,可能一方面原因是我刷的都是简单题,另一方面原因可能是网站有意来提高我们的信心和联想能力。比如有求解二叉树最大深度和求解二叉树最小深度的题目,也有判断两颗树是否完全一致和判断两个树是否轴对称的题目,还有按层次从树根往下输出每层元素和按层次从下往树根输出每层元素的题目等。

昨天解答了按层次从树根往下输出每层元素的题目,今天又碰巧遇到类似的三个题目,并不是我刻意拿这几个题目来说话,而是我觉得算法之间思想是相通的,并不是孤立的,从一个算法可以转变为另一个算法,可能只需要加一些简单的条件,所以我觉得如果我们单纯地为了做题而做题,虽然也能够提高自己的算法水平,但是并不能举一反三,如果我们在做一道题的时候能够多一些联想,多考虑一些其它可能的方式,久而久之,我们的思考能力和分析问题的能力也会得到提高。就拿我自己来说吧,之前从没做过任何算法题,除了在学校数据结构课上学习的一些知识。刚开始做LettCode上简单题算法题时,感觉很困难,一道题都要想半天甚至一天,因为之前从未有过算法相关的训练,思维过程也没有那么的灵活,但是我坚持每一道题都自己想,自己分析每一道题,不管自己算法写的有多烂,只要是对的即可,对于自己这样的新手开始不必要要求那么高。在慢慢坚持刷完二十多道简单题后,我发现自己的思维不再那么刻板,我会通过某一道题联系到另外一些相关的题。我想每道算法题肯定会对应着某一个问题,对应着一个应用场景,要不就没有人提出问题,也没必要去解决它。我还会继续坚持下去,从简单题到困难题,from
easy to hard,坚持刷完已有的166道题目。这个过程也许就是成长的过程吧,并不需要一个完美的结果,只需要坚持自己,做自己想做的事,不断提高自己,从简单开始,从基础开始,慢慢超越自己,提高自己。

分享这短时间在刷题中的一些体会:

(1)不要好高骛远。从简单做起,要不为什么会把题目分为简单、中等、困难呢,万丈高楼从地起。

(2)坚持下去。每两天我都会抽出时间做一做题,虽然上班很忙,抓住身边的暗时间,不久你就会发现不一样的自己。

(3)独立思考。不要一时想不出来就百度,自己想出来的永远也忘记不了,努力自己思考,提高自己的思维能力。

(4)分享。将自己的思路写下来,分享给大家,知识的共享所得回报不是简单的知识相加,而是线性的甚至是指数级的。

希望对你有所帮助。谢谢。

时间: 2024-10-28 16:42:21

从"按层次输出二叉树"到"求解二叉树深度"的总结的相关文章

递归求解二叉树任意一结点的深度

这个事最后一道大题的第一小题 让写个递归算法求解二叉树任意一结点的深度 首先应该去递归找到这个x结点,找到后然后再递归求解以x为根结点的子树的深度,所以我就很规矩(当然我觉得这样写比较明了)写了两个递归函数 当然首先还是得建立二叉排序树 另外注明:是用vs2010写的,没有在vc++6.0上面测试,如果朋友们发现在vc++上有bug,欢迎指出,供后来者看看 贴下自己的代码 //功能:递归算法,求二叉树中以元素值为x的结点为根的子树的深度 //时间:2014-11-23 #include <ios

二叉树的遍历,深度求解以及竖向打印详析

二叉树是每个节点最多有两个子树的有序树.二叉树常被用于实现二叉查找树和二叉堆.值得注意的是,二叉树不是树的特殊情形.在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于2.有根二叉树还要满足根结点的度不大于2.有了根结点后,每个顶点定义了唯一的根结点,和最多2个子结点.然而,没有足够的信息来区分左结点和右结点.二叉树详细请看本文:二叉树 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的操作依赖于具体的应用问 题. 遍历是二叉树上

二叉树的创建和四种遍历(前序、先序、后序、层次、结点的层数、深度、叶子数等)—java描述

二叉树的创建和四种遍历(前序.先序.后序.层次.结点的层数.深度.叶子数等)—java描述 package javab; //树的结点类 public class TreeNode { String data; TreeNode leftChild,rightChild,next; public TreeNode(String data){ this.data=data; } public TreeNode(String data,TreeNode left,TreeNode right){ l

求解二叉树镜像

一,问题介绍 求解一棵二叉树的镜像.所谓镜像,就是从二叉树的根到叶结点的每一层,将所有的非叶子结点的孩子进行交换. 比如说,下面两棵二叉树互为镜像: 二,算法分析 1 /** 2 * 递归求解二叉树的镜像 3 * @param root 4 */ 5 public void mirrorRecursively(BinaryNode<T> root){ 6 //base condition 7 if(root == null || (root.left == null && ro

[LeetCode系列] 二叉树最大深度求解问题(C++递归解法)

问: 给定二叉树, 如何计算二叉树最大深度? 算法描述如下: 如果当前节点为空, 返回0(代表此节点下方最大节点数为0) 如果当前节点不为空, 返回(其左子树和右子树下方最大节点数中的最大值+1) 上述算法的精髓在于递归调用中的终止条件. 代码如下: 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNod

二叉树重建及二叉树广度优先遍历

#include <iostream> #include <queue> using namespace std; //树节点类 class TNode { public: TNode *left, *right; char value; TNode() { left = right = NULL; } TNode(char v) { left = right = NULL; value = v; } }; //根据二叉树的先序遍历和中序遍历重建二叉树 //PreOrder为二叉树

数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)

前言:前面了解了树的概念和基本的存储结构类型及树的分类,而在树中应用最广泛的种类是二叉树 一.简介 在树型结构中,如果每个父节点只有两个子节点,那么这样的树被称为二叉树(Binary tree).其中,一个父结点的两个字节点分别叫做“左子节点”和“右子节点”.不过也不是所有父节点都有两个子节点,只有左子节点或者只有右子节点的情况也存在.另外,也会存在叶子结点,也就是一个子节点都没有的节点,唯一的限制就是每一个节点的子节点不能超过两个. 之前谈过的单向链表,是一种通过“指向下一个元素的指针”来连接

怎样推断一棵二叉树是全然二叉树

严蔚敏那本教材上的说法:一个深度为k,节点个数为 2^k - 1 的二叉树为满二叉树.这个概念非常好理解, 就是一棵树,深度为k,而且没有空位. 首先对满二叉树依照广度优先遍历(从左到右)的顺序进行编号. 一颗深度为k二叉树,有n个节点,然后,也对这棵树进行编号,假设全部的编号都和满二叉树相应,那么这棵树是全然二叉树. 随意的一个二叉树,都能够补成一个满二叉树.这样中间就会有非常多空洞.在广度优先遍历的时候,假设是满二叉树,或者全然二叉树,这些空洞是在广度优先的遍历的末尾,所以,但我们遍历到空洞

剑指offer (19) 二叉树镜像 对称二叉树

题目: 输入一个二叉树,输出其镜像. BinTreeNode* ReverseTree(BinTreeNode* pRoot) { if (pRoot == NULL) return NULL; BinTreeNode* pLeftReverse = ReverseTree(pRoot->left); BinTreeNode* pRightReverse = ReverseTree(pRoot->right); pRoot->left = pRightReverse; pRoot->