算法-树
Edwards_June
Just For My Interest
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?
给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大? 提示:后序遍历,每一个节点保存左右子树的和加上自己的值。额外一个空间存放最大值。 写完后序遍历,面试官可能接着与你讨论, a). 如果要求找出只含正数的最大子树,程序该如何修改来实现?b). 假设我们将子树定义为它和它的部分后代,那该如何解决?c). 对于b,加上正数的限制,方案又该如何? 总之,一道看似简单原创 2017-01-14 14:37:04 · 2005 阅读 · 0 评论 -
城市遍历
#define N 10 void traverse(bool edge[N][N], int m, int n, int cur, int end, int &result) { if (!m && end == cur) { result++; return; } else if (!m && end != cur) { return; } else { for (in原创 2017-01-15 12:06:53 · 1458 阅读 · 0 评论 -
写程序输出8皇后问题的所有排列,要求使用非递归的深度优先遍历。
#define COLS 10 #define WAYS 100 int col[COLS]; int result[WAYS][COLS]; bool isVaild(int level) { for (int i = 1; i < level; ++i) { if (col[i] == col[level] || abs(i - level) == abs(col[i] - col[原创 2017-01-15 12:06:19 · 895 阅读 · 0 评论 -
有一个排序二叉树,数据类型是int型,如何找出中间大的元素。
void tree2Dll(TNode* root, TNode*& tail) { if (!root) { return; } if (root->left) { tree2Dll(root->left, tail); } TNode* tmp = root; tmp->left = tail; if (tail) { tail->right = tmp; } t原创 2017-01-15 12:05:40 · 739 阅读 · 0 评论 -
假设有一颗二叉树,已知这棵树的节点上不均匀的分布了若干石头,石头数跟这棵二叉树的节点数相同,石头只可以在子节点和父节点之间进行搬运,每次只能搬运一颗石头。请问如何以最少的步骤将石头搬运均匀,使得每个节
假设有一颗二叉树,已知这棵树的节点上不均匀的分布了若干石头,石头数跟这棵二叉树的int moveStone(TNode* root, int& stone) { if (!root) { return 0; } int leftStone = 0, rightStone = 0; if (root->left) { //左子树需要移动次数,也就是当前结点会增加的石数 leftS原创 2017-01-15 12:05:01 · 984 阅读 · 0 评论 -
二元查找树转变成排序的双向链表
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。例如把下述二叉查找树 10 / / 6 14 / / / / 4 8 12 转换成双向链表,即得: 4=6=8=10=12=14=16。 void tree2Dll(TNode* root, TNode*& tail) { if (!root) { return; }原创 2017-01-15 12:04:15 · 434 阅读 · 0 评论 -
最少操作次数的简易版
int getMinOperationNum(string a, string b) { int len = a.length(); int curA = len - 1, prevA = len - 1; int curB = len - 1, prevB = len - 1; int result = 0; while (curA >= 0) { if (a[curA] ==原创 2017-01-15 11:54:16 · 925 阅读 · 0 评论 -
最短编辑距离2
传统的编辑距离里面有三种操作,即增、删、改,我们现在要讨论的编辑距离只允许两种操作,即增加一个字符、删除一个字符。我们求两个字符串的这种编辑距离,即把一个字符串变成另外一个字符串的最少操作次数。假定每个字符串长度不超过1000,只有大写英文字母组成。 #define N 100 /* * dp[i][j]表示源串source[0-i)变化为目标串target[0-j)最短操作次数 * */原创 2017-01-14 19:49:53 · 525 阅读 · 0 评论 -
给定两个站点,如果没有直达的路线,如何找到换乘次数最少的路线?
#define N 10 void search(bool edge[N][N], int n, int cur, int end, vector &route, vector &result) { if (cur == end) { if (result.empty() || route.size() < result.size()) { result = route; }原创 2017-01-14 16:51:56 · 1310 阅读 · 0 评论 -
行列递增矩阵的查找
在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 #define ROW 4 #define COL 4 bool findKey(int matrix[][COL], int searchKey) { if (!matrix) { return false;原创 2017-01-14 16:57:28 · 584 阅读 · 0 评论 -
在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会
在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会,且n个人走的总步数最少,先到聚会地点的骑士可以不再移动等待其他的骑士。 从键盘输入n(0 提示:BFS。 #define M 8 #define N 8 #define DIR 8 type原创 2017-01-14 16:45:38 · 2469 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,然后打印出和与输入整数相等的所有路径。 #include #include #include using namespace std; typedef struct BinaryTreeNode { int m_nValue; BinaryTreeNode * m_pLeft; BinaryTr原创 2017-01-13 13:39:42 · 405 阅读 · 0 评论 -
对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。 typedef struct TNode { int data; TNode* left; TNode* right; TNode* next; }; //时间复杂度为O(n),空间复杂度为O原创 2017-01-14 14:30:29 · 1131 阅读 · 0 评论 -
用俩个栈实现队列
某队列的声明如下: template class CQueue { public: CQueue() {} ~CQueue() {} void appendTail(const T& node); // append a element to tail void deleteHead(); // remove a el原创 2017-01-14 13:19:21 · 351 阅读 · 0 评论 -
求树的深度
输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 例如:输入二元树: 10 / / 6 14原创 2017-01-14 13:17:34 · 1392 阅读 · 0 评论 -
请用递归和非递归俩种方法实现二叉树的前序遍历。
//递归前序遍历 void pre_visit(TNode* root) { if (!root) return; cout data << ' '; pre_visit(root->left); pre_visit(root->right); } //非递归前序遍历 void pre_visit1(TNode* root) { if (!root) { cout << "空原创 2017-01-14 13:16:55 · 469 阅读 · 0 评论 -
层序遍历二叉树
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / / 6 10 / / / / 5 7 9 11 输出8 6 10 5 7 9 11。 queue m_queue; void visitByLevel(TNode* root) { if (!root) return; if (m_queue.empty()) { m_原创 2017-01-14 13:15:19 · 564 阅读 · 0 评论 -
求二叉树中节点的最大距离
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。 请写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。 int maxTreeDistance(TNode* root, int &maxDistance) { if (!root) { maxDistance = 0; return 0; } int maxLeft =原创 2017-01-14 12:52:55 · 346 阅读 · 0 评论 -
包含min函数的栈
设计包含min函数的栈 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 class StackWithMin { stack m_data; stack m_min; public: void push(int value) { m_data.push(value); if (m_min.empty原创 2017-01-14 12:52:12 · 317 阅读 · 1 评论 -
判断整数序列是不是二元查找树的后序遍历结果
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果,如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / / 6 10 / / / / 5 7 9 11 因此返回true。 如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。 void fi原创 2017-01-14 12:50:01 · 320 阅读 · 0 评论 -
最小操作数
给定一个单词集合Dict,其中每个单词的长度都相同。现从此单词集合Dict中抽取两个单词A、B,我们希望通过若干次操作把单词A变成单词B,每次操作可以改变单词的一个字母,同时,新产生的单词必须是在给定的单词集合Dict中。求所有行得通步数最少的修改方法。 举个例子如下: Given: A = "hit" B = "cog" Dict = ["hot","dot","dog","lot",原创 2017-01-14 12:24:52 · 651 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 void help(int k, int cur, TNode* head, vector vct) { if (k <= cur || !head) { return; } if (!head->left && !head->right && cu原创 2017-01-14 12:47:00 · 353 阅读 · 0 评论
分享