一、

1. Lowest Common Ancestor

 class Solution {
public:
TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *A, TreeNode *B) {
if (root == NULL || root == A || root == B) {
return root;
}
TreeNode* left = lowestCommonAncestor(root->left, A, B);
TreeNode* right = lowestCommonAncestor(root->right, A, B);
if (left != NULL && right != NULL) {
return root;
}
if (left != NULL) {
return left;
}
if (right != NULL) {
return right;
}
return NULL;
}
};

refer : July,剑指offer

2. Lowest Common Ancestor of a Binary Search Tree

 class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL || p == NULL || q == NULL) {
return NULL;
}
if (root->val > p->val && root->val > q->val) {
return lowestCommonAncestor(root->left, p, q);
}
if (root->val < p->val && root->val < q->val) {
return lowestCommonAncestor(root->right, p, q);
}
return root;
}
};

二. Level order [BFS]

1. Binary Tree Level Order Traversal

 class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if (root == NULL) {
return result;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()) {
int size = q.size();
vector<int> v;
for (int i = ; i < size; i++) {
TreeNode* tmp = q.front();
q.pop();
v.push_back(tmp->val);
if (tmp->left != NULL) {
q.push(tmp->left);
}
if (tmp->right != NULL) {
q.push(tmp->right);
}
}
result.push_back(v);
}
return result;
}
};

2. Binary Tree Level Order Traversal II

 class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> result;
if (root == NULL) {
return result;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()) {
int size = q.size();
vector<int> v;
for (int i = ; i < size; i++) {
TreeNode* tmp = q.front();
q.pop();
v.push_back(tmp->val);
if (tmp->left != NULL) {
q.push(tmp->left);
}
if (tmp->right != NULL) {
q.push(tmp->right);
}
}
result.push_back(v);
}
reverse(result.begin(), result.end());
return result;
}
};

在1的基础上多加一句reverse即可。

3. Binary Tree Zigzag Level Order Traversal

 class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> result;
if (root == NULL) {
return result;
}
queue<TreeNode*> q;
q.push(root);
int count = ;
while(!q.empty()) {
count++;
int size = q.size();
vector<int> v;
for (int i = ; i < size; i++) {
TreeNode* tmp = q.front();
q.pop();
v.push_back(tmp->val);
if (tmp->left != NULL) {
q.push(tmp->left);
}
if (tmp->right != NULL) {
q.push(tmp->right);
}
}
if (count % == ) {
reverse(v.begin(), v.end());
}
result.push_back(v);
}
return result;
}
};

在1的基础上多加个count变量,偶数行就reverse一下即可

三、

1. Insert Node in a Binary Search Tree

 TreeNode* insertNode(TreeNode* root, TreeNode* node) {
if (root == NULL) {
return node;
}
if (node->val > root->val) {
root->right = insertNode(root->right, node);
} else {
root->left = insertNode(root->left, node);
}
return root;
}

2. Search Range in Binary Search Tree

code1:

 class Solution {
public:
vector<int> searchRange(TreeNode* root, int k1, int k2) {
helper(root, k1, k2);
return result;
}
void helper(TreeNode* root, int k1, int k2) {
if (root == NULL) {
return;
}
if (k1 < root->val) {//说明左子树里有可能有
helper(root->left, k1, k2);
}
if (root->val >= k1 && root->val <= k2) {
result.push_back(root->val);
}
if (k2 > root->val) {
helper(root->right, k1, k2);
}
}
private:
vector<int> result;
};

code2: 自己实现的,太繁琐。

 vector<int> searchRange(TreeNode* root, int k1, int k2) {
vector<int> result;
if (root == NULL) {
return result;
}
if (root->val < k1) {
return searchRange(root->right, k1, k2);
}
if (root->val > k2) {
return searchRange(root->left, k1, k2);
}
if (root->val >= k1 && root->val <= k2) {
vector<int> tmp1 = searchRange(root->left, k1, root->val - );
vector<int> tmp2 = searchRange(root->right, root->val + , k2);
result.insert(result.end(), tmp1.begin(), tmp1.end());
result.push_back(root->val);
result.insert(result.end(), tmp2.begin(), tmp2.end());
}
return result;
}

Binary Search Tree Iterator

 class BSTIterator {
public:
BSTIterator(TreeNode* root) {
pushAll(root);
} bool hasNext() {
return (!myStack.empty());
} int next() {
TreeNode* tmp = myStack.top();
myStack.pop();
pushAll(tmp->right);
return tmp->val;
} private:
stack<TreeNode*> myStack;
void pushAll(TreeNode* node);
}; void BSTIterator::pushAll(TreeNode* node) {
while (node != NULL) {
myStack.push(node);
node = node->left;
}
} /**
* Your BSTIterator will be called like this:
* BSTIterator i = BSTIterator(root);
* while (i.hasNext()) cout << i.next();
*/

Remove Node in Binary Search Tree

Binary Tree Maximum Path Sum

参见 ref十五

Binary Tree Serialization

===================================================

对于n个数的数组,一个数x如果从左往右数是第k个数,那么从右往左数的话是第(n - k + 1)个数。

leetcode Ch4-Binary Tree & BFS & Divide/Conquer的更多相关文章

  1. [LeetCode] 199. Binary Tree Right Side View 二叉树的右侧视图

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  2. leetcode 199 :Binary Tree Right Side View

    // 我的代码 package Leetcode; /** * 199. Binary Tree Right Side View * address: https://leetcode.com/pro ...

  3. LeetCode:Construct Binary Tree from Inorder and Postorder Traversal,Construct Binary Tree from Preorder and Inorder Traversal

    LeetCode:Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder trav ...

  4. (二叉树 递归) leetcode 145. Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,null,2, ...

  5. leetcode 199. Binary Tree Right Side View 、leetcode 116. Populating Next Right Pointers in Each Node 、117. Populating Next Right Pointers in Each Node II

    leetcode 199. Binary Tree Right Side View 这个题实际上就是把每一行最右侧的树打印出来,所以实际上还是一个层次遍历. 依旧利用之前层次遍历的代码,每次大的循环存 ...

  6. [LeetCode] 549. Binary Tree Longest Consecutive Sequence II_ Medium tag: DFS recursive

    Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree. Especia ...

  7. LeetCode 145 Binary Tree Postorder Traversal(二叉树的兴许遍历)+(二叉树、迭代)

    翻译 给定一个二叉树.返回其兴许遍历的节点的值. 比如: 给定二叉树为 {1. #, 2, 3} 1 \ 2 / 3 返回 [3, 2, 1] 备注:用递归是微不足道的,你能够用迭代来完毕它吗? 原文 ...

  8. LeetCode—— Invert Binary Tree

    LeetCode-- Invert Binary Tree Question invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 ...

  9. Java for LeetCode 107 Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

随机推荐

  1. (转)InnoDB存储引擎MVCC实现原理

    InnoDB存储引擎MVCC实现原理 原文:https://liuzhengyang.github.io/2017/04/18/innodb-mvcc/ 简单背景介绍 MySQL MySQL是现在最流 ...

  2. redis的 list

    redis的list是一个双向链表,既可以用作栈,也可以用作队列,幸好大学学过数据结构,还有印象. 栈:先进后出,队列:先进先出 redis链表操作: 应用场景学习list链表:要获取最新的10个登录 ...

  3. 一头扎进Spring之---------Spring核心容器----------

    1.什么是 IOC/DI? IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创建.依赖的代码,反转给容器来帮忙实现.那么必然的我们需要创建 ...

  4. docker中的命令参数(小白常用)

    1 docker run run是最常用的命令,他是docker creat和docker start命令的组合,创建容器并启动它.run的参数比较难理解的是-i 和-t 以及-d,分别说说这三个. ...

  5. Android服务--布局服务(LayoutInflater)

    1. 基本概念 1. 概念: 参考资料:https://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 一个用于加载布局的系统服务, ...

  6. LINQ操作List<T>

    LINQ操作List<T>主要包括: 1.筛选 List<string> stcdList = stcdArray.ToList<string>() .FindAl ...

  7. 图标插件FusionChartsFree

    二.介绍 Ø FusionCharts 是InfoSoft Global 公司的一个产品,InfoSoft Global 公司是专业的Flash 图形方案提供商,他们还有几款其他的,基于Flash 技 ...

  8. jQuery几个易混淆之处(参考《众妙之门》及相关博客)

    parent() && parents() && closest() 这三个方法都与沿着DOM向上导航有关,在由选择器返回的元素上方,匹配父元素或之前的祖先元素,但是每 ...

  9. Java - 方法的参数声明

    给方法的参数加上限制是很常见的,比如参数代表索引时不能为负数.对于某个关键对象引用不能为null,否则会进行一些处理,比如抛出相应的异常信息. 对于这些参数限制,方法的提供者必须在文档中注明,并且在方 ...

  10. JSONObject与null

    前言 今天在写代码的时候发现在 JSON 中 由于put了key对应的value为null,结果这个JSON键值对没有输出 org.json.JSONObject 在orgJSON 中,如果直接put ...