Careercup | Chapter 4
二叉查换树,左孩子小于等于根,右孩子大于根。
完全二叉树,除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点。 complete binary tree
满二叉树,完美二叉树是全部结点数达到最大的二叉树。perfect binary tree, full binary tree.
平衡二叉树,左右子树的高度在一定范围内。
二叉查找树(Binary Search Tree),也称二叉搜索树、有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
- 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 任意节点的左、右子树也分别为二叉查找树。
- 没有键值相等的节点(no duplicate nodes)。
在二叉查找树删去一个结点,分三种情况讨论:
- 若*p结点为叶子结点,即PL(左子树)和PR(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。
- 若*p结点只有左子树PL或右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,作此修改也不破坏二叉查找树的特性。
- 若*p结点的左子树和右子树均不空。在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,可以有两种做法:其一是令*p的左子树为*f的左/右(依*p是*f的左子树还是右子树而定)子树,*s为*p左子树的最右下的结点,而*p的右子树为*s的右子树;其二是令*p的直接前驱(in-order predecessor)或直接后继(in-order successor)替代*p,然后再从二叉查找树中删去它的直接前驱(或直接后继)。
4.1 Implement a function to check if a binary tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that the heights of the two subtrees of any node never differ by more than one.
点此。
4.2 Given a directed graph, design an algorithm to find out whether there is a route between two nodes.
BFS或者DFS就行了,不过BFS可以避免在单条路径上挖得太深。
4.3 Given a sorted (increasing order) array with unique integer elements, write an algorithm to create a binary search tree with minimal height
点此。
4.4 Given a binary tree, design an algorithm which creates a linked list of all the nodes at each depth (e.g., if you have a tree with depth D, you'll have D linked lists).
BFS或者DFS都可以。注意的是,DFS虽然会用额外的O(lgn)的栈空间,但是整体的空间复杂度还是O(n)。
4.5 Implement a function to check if a binary tree is a binary search tree.
点此。BST要和中序遍历联系在一起。
4.6 Write an algorithm to find the 'next'node (i.e., in-order successor) of a given node in a binary search tree. You may assume that each node has a link to its parent.
如果有root结点,直接用中序遍历记录pre结点就可以做的。如果只有结点,那么需要分情况。
4.7 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tree. Avoid storing additional nodes in a data structure. NOTE: This is not necessarily a binary search tree.
leetcode上的博文,讲得很仔细。这道题很经典,尤其是有parent结点时的解法,类似求intersect linklist的交叉点。
4.8 You have two very large binary trees: Tl, with millions of nodes, and T2, with hundreds of nodes. Create an algorithm to decide if T2 is a subtree of Tl. A tree T2 is a subtree of Tl if there exists a node n in Tl such that the subtree of n is identical to T2. That is, if you cut off the tree at node n, the two trees would be identical.
这道题可以穷搜,也可以基于pre-order和in-order的travesal串,用子串查找。
4.9 You are given a binary tree in which each node contains a value. Design an algorithm to print all paths which sum to a given value. The path does not need to start or end at the root or a leaf.
只能穷搜了。
struct TreeNode {
TreeNode *left;
TreeNode *right;
TreeNode *parent;
int val;
TreeNode(int v):val(v),left(NULL),right(NULL),parent(NULL) {}
};
// 4.6
TreeNode* findInorderNext(TreeNode* node) {
if (node == NULL) {
return NULL;
} else if (node->right) {
node = node->right;
while (node->left) node = node->left;
return node;
} else {
while (node->parent && node->parent->left != node) node = node->parent;
return node->parent;
}
}
TreeNode* findPreordeNext(TreeNode* node) {
if (node == NULL) {
return NULL;
} else if (node->left) {
return node->left;
} else if (node->right) {
return node->right;
} else {
while (node->parent && node->parent->right == node) {
node = node->parent;
}
if (node->parent) return node->parent->right;
else return NULL;
}
}
TreeNode* findPostorderNext(TreeNode* node) {
if (node == NULL || node->parent == NULL) {
return NULL;
} else if (node->parent->right == node || node->parent->right == NULL) { // right subtree
return node->parent;
} else {
node = node->parent->right;
while (node->left) node = node->left;
return node;
}
}
// 4.7 (1) p, q in the BST, O(h) runtime
TreeNode* LCAInBST(TreeNode *root, TreeNode *p, TreeNode *q) {
if (!root || !p || !q) return NULL;
if (max(p->val, q->val) < root->val) {
return LCAInBST(root->left, p, q);
} else if (min(p->val, q->val) > root->val) {
return LCAInBST(root->right, p, q);
} else {
return root;
}
}
// 4.7 (2.1) p, q may not in the tree, this is just a binary tree
int matchCount(bool pExisted, bool qExisted) {
int m = ;
if (pExisted) m++;
if (qExisted) m++;
return m;
}
TreeNode* LCAInBT(TreeNode *root, TreeNode *p, TreeNode *q, bool &pExisted, bool &qExisted) {
if (!root) return NULL;
TreeNode* ret = LCAInBT(root->left, p, q, pExisted, qExisted);
int lm = matchCount(pExisted, qExisted);
if (lm == ) return ret; // p, q are in the left subtree
ret = LCAInBT(root->right, p, q, pExisted, qExisted);
int rm = matchCount(pExisted, qExisted);
if (rm == ) { // p, q are found
if (lm == ) return root; //p, q are in different subtree, thus return root
else return ret; // lm == 0, p, q are in the right subtree
}
if (root == p) pExisted = true;
if (root == q) qExisted = true;
if (pExisted && qExisted) return root; // if q is a child of q (or, q is a child of p)
return NULL; // if p or q is not existed
}
// 4.7(2.2) the parent node is available
int getHeight(TreeNode* p) {
int h = ;
while (p) {
p = p->parent;
h++;
}
return h;
}
TreeNode* LCAInBT(TreeNode *p, TreeNode *q) {
if (!p || !q) return NULL;
int h1 = getHeight(p);
int h2 = getHeight(q);
if (h1 > h2) {
swap(p, q);
swap(h1, h2);
}
for (int i = ; i < h2 - h1; ++i) {
q = q->parent;
}
while (p && q) {
if (p == q) return p;
p = p->parent;
q = q->parent;
}
return NULL;
}
Careercup | Chapter 4的更多相关文章
- Careercup | Chapter 1
1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot us ...
- Careercup | Chapter 3
3.1 Describe how you could use a single array to implement three stacks. Flexible Divisions的方案,当某个栈满 ...
- Careercup | Chapter 2
链表的题里面,快慢指针.双指针用得很多. 2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow w ...
- Careercup | Chapter 8
8.2 Imagine you have a call center with three levels of employees: respondent, manager, and director ...
- Careercup | Chapter 7
7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...
- CareerCup Chapter 9 Sorting and Searching
9.1 You are given two sorted arrays, A and B, and A has a large enough buffer at the end to hold B. ...
- CareerCup chapter 1 Arrays and Strings
1.Implement an algorithm to determine if a string has all unique characters What if you can not use ...
- CareerCup Chapter 4 Trees and Graphs
struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val):val(val),left(NULL),rig ...
- Careercup | Chapter 6
6.2 There is an 8x8 chess board in which two diagonally opposite corners have been cut off. You are ...
- Careercup | Chapter 5
5.1 You are given two 32-bit numbers, N andM, and two bit positions, i and j. Write a method to inse ...
随机推荐
- static关键字所导致的内存泄漏问题
大家都知道内存泄漏和内存溢出是不一样的,内存泄漏所导致的越来越多的内存得不到回收的失手,最终就有可能导致内存溢出,下面说一下使用staitc属性所导致的内存泄漏的问题. 在dalvik虚拟机中,sta ...
- python3.7 文件操作
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 文件操作 # r 只读,默认打开方式,当文件不存在时会报错 # ...
- Python爬取全站妹子图片,差点硬盘走火了!
在这严寒的冬日,为了点燃我们的热情,今天小编可是给大家带来了偷偷收藏了很久的好东西.大家要注意点哈,我第一次使用的时候,大意导致差点坏了大事哈! 1.所需库安装 2.网站分析 首先打开妹子图的官网(m ...
- 在windows7 32ibt安装MongoDB数据库的方法及连接失败解决方案
参考 https://www.cnblogs.com/cnblogs-jcy/p/6734889.html http://yunkus.com/mongodb-install-config-in-wi ...
- shell-code-拷贝文件
#!/bin/bash while read F do cp ${F}"_pe_1.fastq.gz" /public/home/chenjy/usr/ZD/data/cleand ...
- Linux学习-用 make 进行宏编译
为什么要用 make 先来想象一个案例,假设我的执行档里面包含了四个原始码文件,分别是 main.c haha.c sin_value.c cos_value.c 这四个文件,这四个文件的目的是: m ...
- MySQL主从复制(Master-Slave)
MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能. 下图就描述了一个多个数 ...
- 02_ThreadLocal语法与源码分析
文章导读: 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程 ...
- 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- 聊聊、Java Keytool P12 转 JKS
最近公司合作机构需要更改服务证书,总共给了 3 个文件过来.openapi-cert.p12.openapi-cert.key.openapi-cert.crt. openapi-cert.crt - ...