
数据结构与算法
一只黑瘦
爱搞事的Boy
展开
-
求二叉树的深度和宽度
二叉树的深度二叉树深度的定义:从根节点到叶子节点依次经过的节点形成树的一条路径,最长路径所包含的节点的个数为树的深度,也即二叉树节点的层数。可将二叉树的节点定义为如下的形式:struct BinTreeNode{ int value; BinTreeNode* pLeft; BinTreeNode* pRight;};解题思路:很自然的可以想到,树的深...原创 2019-06-13 15:59:44 · 2825 阅读 · 0 评论 -
找出链表中的倒数第k个节点
解题思路:设置两个指针,这两个指针都指向链表的头结点,让第一个节点走k-1步,走到第k个节点的位置;然后在让两个指针向后移动,直到第一个指针指到链表最后一个节点的位置,此时第二个指针指向的就是链表的倒数第k个指针。实现代码如下:class Solution {public: ListNode* FindKthToTail(ListNode* pListHead, unsigne...原创 2019-06-14 19:14:02 · 166 阅读 · 0 评论 -
找出两个链表的第一个公共节点
解题思路:两个链表的从第一个公共节点开始,之后的节点均为公共的,若两个链表的长度不一致,则先将指向长度较长的链表的头结点向后移动两个链表长度差个位置,然后将此指针和链表长度较短的头指针同时后移,若两个指针相同,则就找到了第一个公共指针。实现代码如下:class Solution {public: ListNode* FindFirstCommonNode( ListNode...原创 2019-06-14 19:26:45 · 262 阅读 · 0 评论 -
判断二叉树是否为平衡二叉树
平衡二叉树:平衡二叉树必须满足两个条件:1)左右子树的高度差不能大于1 2)每个根节点下面的左右子树也必须满足平衡二叉树的性质。解题思路:使用后序遍历,遍历过程中求左右子树的高度,判断是否平衡实现代码如下:class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { int d...原创 2019-06-15 11:02:23 · 190 阅读 · 0 评论 -
二叉树的子树和子结构
定义:子树:是只要包含了一个结点,就得包含这个结点下的所有节点。子结构:包含了一个结点,可以只取左子树或者右子树,或者都不取。判断一个二叉树是不是另一个二叉树子树的代码实现如下:class Solution {public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { if(p...原创 2019-06-17 22:20:58 · 1222 阅读 · 2 评论 -
二叉树的遍历
二叉树的遍历方式主要分为前序、中序、后序、层次遍历几种。前序、中序、后序分为递归和非递归方法两种,但其实根本来说都是使用堆栈来实现的,因为递归方法其实也是使用堆栈实现的。前序遍历的递归方法代码实现如下所示:void PreOrderRec(Node * node){ if (node) { cout << node->data <&...原创 2019-06-18 19:25:38 · 133 阅读 · 0 评论 -
最长递增子序列(动态规划方法)
最长递增子序列问题描述:设长度为N的数组为{a0,a1, a2, ...an-1},假定以aj结尾的数组序列的最长递增子序列长度为L(j),则有:L(j)={ max(L(i))+1, i<j且a[i]<a[j] }。也就是说,我们需要遍历在j之前的所有位置i(从0到j-1),找出满足条件a[i]<a[j]的L(i),求出max(L(i))+1即为L(j)的值。最后,我们遍历...原创 2019-06-24 22:24:35 · 814 阅读 · 0 评论