Chp4: Trees and Graphs
1.Type of Tree
1. Binary Tree:
a binary tree is a tree in which each node has at most two child nodes(denoted as the left child and the right child).
- A directed edge refers to the link from the parent to the child (the arrows in the picture of the tree).
- The root node of a tree is the node with no parents. There is at most one root node in a rooted tree.
- A leaf node has no children.
- The depth (or height) of a tree is the length of the path from the root to the deepest node in the tree. A (rooted) tree with only one node (the root) has a depth of zero.
- Siblings are those nodes that share the same parent node.
- A node p is an ancestor of a node q if p exists on the path from the root node to node q. The node q is then termed as a descendant of p.
- The size of a node is the number of descendants it has including itself.
- The in-degree of a node is the number of edges arriving at that node.
- The out-degree of a node is the number of edges leaving that node.
- The root is the only node in a tree with an in-degree of 0.
- All the leaf nodes have an out-degree of 0.
2. perfect binary tree:
A perfect binary tree is a full binary tree in which all leaves are at the same depth or same level, and in which every parent has two children.[2] (This is ambiguously also called a complete binary tree (see next).) An example of a perfect binary tree is the ancestry chart of a person to a given depth, as each person has exactly two biological parents (one mother and one father); note that this reverses the usual parent/child tree convention, and these trees go in the opposite direction from usual (root at bottom).
3. complete binary tree:
A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible.[3] A tree is called an almost complete binary tree or nearly complete binary tree if the exception holds, i.e. the last level is not completely filled. This type of tree is used as a specialized data structure called a heap.
4.Balanced Binary Tree:
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
the tree is only balanced if:
- The left and right subtrees' heights differ by at most one, AND
- The left subtree is balanced, AND
- The right subtree is balanced
so tree like this is also balanced:
o
/ \
o o
/ / \
o o o
/
o
5. Binary Search Tree:
a binary search tree (BST), sometimes also called an ordered orsorted binary tree, is a node-based binary tree data structure which has the following properties:[1]
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- The left and right subtree each must also be a binary search tree.
- There must be no duplicate nodes.
| Binary search tree | ||
|---|---|---|
| Type | Tree | |
| Time complexity in big O notation | ||
| Average | Worst case | |
| Space | O(n) | O(n) |
| Search | O(log n) | O(n) |
| Insert | O(log n) | O(n) |
| Delete | O(log n) | O(n) |
2. Binary Tree Traversal
in-order, pre-order, post-order
这三种都可以使用recursive 来实现,也可以使用iterative。 见
in-order http://www.cnblogs.com/reynold-lei/p/3458710.html
pre-order http://www.cnblogs.com/reynold-lei/p/3443067.html
post-order http://www.cnblogs.com/reynold-lei/p/3455756.html
3. Tries
trie,又称前缀树或字典樹,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
一个保存了 8 个键的 trie 结构,"A", "to", "tea", "ted", "ten", "i", "in", and "inn".
In the example shown, keys are listed in the nodes and values below them. Each complete English word has an arbitrary integer value associated with it. A trie can be seen as adeterministic finite automaton, although the symbol on each edge is often implicit in the order of the branches.
It is not necessary for keys to be explicitly stored in nodes. (In the figure, words are shown only to illustrate how the trie works.)
Though tries are most commonly keyed by character strings, they don't need to be. The same algorithms can easily be adapted to serve similar functions of ordered lists of any construct, e.g., permutations on a list of digits or shapes. In particular, a bitwise trie is keyed on the individual bits making up a short, fixed size of bits such as an integer number or memory address.
4. Tree Balancing: Red-Black Trees and AVL Trees
Problem:
4.1 check if a binary tree is balanced.
public int getHeight(TreeNode root){
if(root == null) return 0;
return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
}
public boolean isBalanced(TreeNode root){
if(root == null) return true;
if(Math.abs(getHeight(root.left) - getHeight(root.right)) > 1){
return false;
}else{
return isBalanced(root.left) && isBalanced(root.right);
}
}
这段代码写的很简洁, 值得学习!
4.3 give a sorted array(increasing order), create a binary search tree with minimal height.
Solution:(recurse) 1 insert into the tree the middle element of the array
2 insert into the left subarray elements
3 insert into the right subarray elements
TreeNode create(int arr[], int start, int end){
if(end < start) return null;
int mid = (start + end) / 2;
TreeNode n = new TreeNode(arr[mid]);
n.left = create(arr, start, mid - 1);
n.right = create(arr, mid + 1, end);
return n;
}
TreeNode createBST(int arr[]){
return create(arr, 0 , arr.length - 1);
}
4.4 Given a binary search tree, design an algo which creates a linked list of all nodes at each depth. (same as leetcode)
void createLevelLinkedList(TreeNode root, ArrayList<LinkedList<TreeNode>> lists, int level){
if(root == null) return;
LinkedList<TreeNode> list = null;
if(lists.size() == level) lists.add(list);
else list = lists.get(level);
list.add(root);
createLevelLinkedList(root.left, lists, level + 1);
createLevelLinkedList(root.right, lists, level + 1);
}
ArrayList<LinkedList<TreeNode>> createLevelLinkedList(TreeNode root){
ArrayList<LinkedList<TreeNode>> lists = new ArrayList<LinkedList<TreeNode>>();
createLevelLinkedList(root, lists, 0);
return lists;
}
4.5 Implement a function to check if a binary tree is a binary search tree.
Function 1: In-order traversal : copy elements into an array, check if the array is sorted.
Notice that we only need to track the last element.
int last_printed = Integer.MIN_VALUE;
public boolean checkBST(TreeNode n){
if(n == null) return true;
if(!checkBST(n.left)) return false;
if(n.data < last_printed) return false;
last_printed = n.data;
if(!checkBST(n.right)) return false;
return true;
}
Function 2: The Min / Max Solution : the condition is that all left nodes must be less than or equals to the current node, which must be less than all right nodes.
boolean checkBST(TreeNode n){
return checkBST(n, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
boolean checkBST(TreeNode n, int min, int max){
if(n == null) return true;
if(n.data <= min || n.data > max) return false;
if(!checkBST(n.left, min, n.data) || !checkBST(n.right, n.data, max)) return false;
return true;
}
4.6 find the 'next' node, i.e, in-order successor, of a given node in a binary search tree. (each node has a link to its parent)
public TreeNode inorderSucc(TreeNode n){
if(n == null) return null;
//find right children -> return leftmost node of right subtree, n.parent == null is the root node
if(n.parent == null || n.right != null) return leftmost(n.right);
else{
TreeNode q = n;
TreeNode x = q.parent;
//go up until we are on left instead of right
while(x != null && x.left != q){
q = x;
x = x.parent;
}
return x;// if n is the right most node, it will return null
}
}
public TreeNode leftmost(TreeNode n){
if(n == null) return null;
while(n.left != null) n = n.left;
return n;
}
4.7 Find the first common ancestor of two nodes in a binary tree. Note: this is not necessarily a binary search tree.
if the tree is BST:
TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q){
if(root == null || p == null || q == null) return false;
if(root.val > p.val && root.val > q.val) return commonAncestor(root.left, p, q);
else if(root.val < p.val && root.val < q.val) return commonAncestor(root.right, p, q);
else return root;
}
in the same way, we can check which p and q are on the same side.
//returns true if p is a descendent of root
boolean covers(TreeNode root, TreeNode p){
if(root == null) return false;
if(root == p) return true;
return covers(root.left, p) || covers(root.right, p);
}
TreeNode commonAncestor(TreeNode root, TreeNode p, TreeNode q){
if(root == null) return null;
if(root == p || root == q) return root;
boolean is_p_on_left = covers(root.left, p);
boolean is_q_on_right = covers(root.right, q);
//if p and q are on different sides, return root
if(is_q_on_right != is_p_on_left) return root; //else, they are on the same side, traverse this side.
TreeNode child = is_p_on_left ? root.left : root.right;
return commonAncestor(child, p, q);
}
TreeNode main(TreeNode root, TreeNode p, TreeNode q){
if(!covers(root, p) || !covers(root, q)) return null;
return commonAncestor(root, p, q);
}
4.9 Given a binary tree in which each node contains a value. Design an algo to print all paths which sum to a given value. Note that path can start or end anywhere in the tree.
这一题不是太懂!
Chp4: Trees and Graphs的更多相关文章
- Cracking the Coding Interview(Trees and Graphs)
Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...
- CareerCup Chapter 4 Trees and Graphs
struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val):val(val),left(NULL),rig ...
- 【CareerCup】Trees and Graphs—Q4.3
转载请注明出处:http://blog.csdn.net/ns_code/article/details/24744177 题目: Given a sorted (increasing ord ...
- 【2018 ICPC亚洲区域赛徐州站 A】Rikka with Minimum Spanning Trees(求最小生成树个数与总权值的乘积)
Hello everyone! I am your old friend Rikka. Welcome to Xuzhou. This is the first problem, which is a ...
- CareerCup All in One 题目汇总 (未完待续...)
Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...
- Lua 架构 The Lua Architecture
转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间 ...
- Cracking the coding interview--问题与解答
http://www.hawstein.com/posts/ctci-solutions-contents.html 作者:Hawstein出处:http://hawstein.com/posts/c ...
- How do I learn machine learning?
https://www.quora.com/How-do-I-learn-machine-learning-1?redirected_qid=6578644 How Can I Learn X? ...
- CareerCup All in One 题目汇总
Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...
随机推荐
- CP30 ---DataSource连接池的创建过程
1.参看CP30文档quickStart 如下具体创建步骤 public DataSource getDs() throws Exception { //创建连接池对象 ComboPooledData ...
- 基于JQuery+JSP的无数据库无刷新多人在线聊天室
JQuery是一款非常强大的javascript插件,本文就针对Ajax前台和JSP后台来实现一个无刷新的多人在线聊天室,该实现的数据全部存储在服务端内存里,没有用到数据库,本文会提供所有源程序,需要 ...
- 正则匹配 去掉 多余的js和html标签
$reg17 = '/><strong>公司介绍<\/strong><\/td>([\S\s*]+?)<\/div>/'; $this->d ...
- hadoop启动后jps 没有namenode
hadoop集群启动后,jps 发现没有namenode. 网上查了下,这问题可能是由于两次或两次以上格式化NameNode造成的. 因为我的是刚刚新搭建的集群,里面没什么资料,所以我直接删除各个 ...
- ENVI 5.1操作心得
1.ENVI中计算的NDVI导出ARCGIS中识别的float数据类型,选择File——save as——erdas img.在ARCGIS中就能统计出NDVI信息 2.如何去掉Nan值从影像中心位置 ...
- const 的全面总结
可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类 ...
- nodejs是单线程
你不妨先思考一个问题:在单核时代,PHP之类多线程或者多进程的,是怎么处理并发的?是排队吗? 答案是:的确就是排队.但是并不是一定要处理完请求1才能去处理请求2:实际上请求的处理过程中,有很多的时间是 ...
- ios开发之数据的持久化存储机制
IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...
- ThinkPHP/Common/extend.php
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ ...
- (ACM)C++ STL 训练(第一天)
因为老师说ACM考的是纯C++,所以打算抛弃VS的VC++不用了,针对纯C++的编译器有Intel Compiler(不过要钱),MinGw(个人用的),当然还有微软的VC++ 编译器,IDE你们可以 ...