随笔分类 - 算法-树
摘要:题目:给定一棵二叉树,结点的距离就是两个结点之间路径包含的结点的数目,求结点的最大距离。可以参考这两篇文章:《编程之美: 求二叉树中节点的最大距离》的另一个解法和Tree Diameter思路:在每一个结点处,求两个信息:以该结点为根的树的高度,以及以该结点为根的树中包含的最大距离。因为所求的最大距...
阅读全文
摘要:何海涛博客:二叉查找树变为排序的双向链表思路:递归。如果根为空,则直接返回;先转换左子树,转换成功,则把左子树转换成的链表最后一个节点和根连接;再转换右子树,把转换后的链表第一个节点和根连接;最后返回链表头/尾节点。 1 struct TreeNode 2 { 3 int val; 4 ...
阅读全文
摘要:二叉树的创建。这里采用最简单的情况,创建完全二叉树,用数组来保存: 1 struct TreeNode 2 { 3 int val; 4 TreeNode *left, *right; 5 TreeNode(int x): val(x), left(NULL), right(...
阅读全文
摘要:题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点。思路:如果有指向父亲的结点,则:如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点;否则,如果当前结点是父结点的左儿子,则后继结点就是父结点;(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先)否则,向...
阅读全文
摘要:题目:给定一棵二叉树,将所有的结点都放到左儿子的位置,即除了root结点外,每一个结点都是其他某一个结点的左儿子。不用保持某种顺序,不能递归,O(1)空间。思路:我的想法是,维持一个遍历指针p,另一个指针tail永远指向向左遍历到底的结点;初始化p和tail都为root,开始循环:如果p为叶子结点,...
阅读全文
摘要:题目:给定一棵完全二叉树,返回最后一层的最右边的节点。思路:层次遍历,用一个last变量记录每次出队列的值,遍历结束之后last变量记录的就是所求节点。时间、空间复杂度都是O(N)。递归,求子树的高度:如果当前根节点为叶子节点,则返回;如果左子树高度>右子树高度,则在左子树继续递归过程;否则在右子树...
阅读全文