Leetcode Binary Tree 用の関数一覧
Leetcode Binary Tree 用の関数一覧
#include "leetcode.h"
#include "mydefine.h"
/*
void dfs(TreeNode* n) {
//End
if (n == nullptr) return;
//Process
//Transition
dfs(n->left);
dfs(n->right);
}
*/
/*
void dfs(TreeNode* n) {
if (n == nullptr) return;
dfs(n->left);
dfs(n->right);
}
*/
/*
bool isLeaf(TreeNode* n) { return n != nullptr && n->left == nullptr && n->right == nullptr; }
*/
class BinaryTree_Solution {
public:
bool isLeaf(TreeNode* n) { return n != nullptr && n->left == nullptr && n->right == nullptr; }
//+-------------------------+
//| List up all Leaf depth; |
//+-------------------------+
set<int> v_depth;
void leaf_depth(TreeNode* n, int d = 1) {
if (n == nullptr) return;
if (isLeaf(n)) v_depth.insert(d);
leaf_depth(n->left, d + 1);
leaf_depth(n->right, d + 1);
}
//max depth up Leaf depth Node which has children
int tmp = 0;
int maxD = 0;
int maxDepth(Node* n) {
if (n == nullptr) return tmp;
tmp++;
maxD = max(tmp, maxD);
rep(i, 0, n->children.size()) {
maxDepth(n->children[i]);
}
tmp--;
return maxD;
}
//Calculate height at one node.
int node_height(TreeNode* n, int d = 1) {
if (n == nullptr) return 0;
if (isLeaf(n)) return d;
return max(node_height(n->left, d + 1), node_height(n->right, d + 1));
}
//+---------------------------------+
//| List up nodes from root to leaf |
//+---------------------------------+
VVi root_leaves;
Vi root_leaf;
void listup_root_leaf(TreeNode* n) {
if (n == nullptr) return;
root_leaf.push_back(n->val);
if (isLeaf(n)) {
root_leaves.push_back(root_leaf);
return;
}
if (n->left != nullptr) {
listup_root_leaf(n->left);
root_leaf.pop_back();
}
if (n->right != nullptr) {
listup_root_leaf(n->right);
root_leaf.pop_back();
}
}
//+-------------------------------------------+
//| List up same height nodes; <height,nodes> |
//+-------------------------------------------+
//vector<TreeNode*>
map<int, vector<TreeNode*>> m_nodes;
void listUpSameLevelNodes(TreeNode* n, int d = 1) {
if (n == nullptr) return;
m_nodes[d].push_back(n);
listUpSameLevelNodes(n->left, d + 1);
listUpSameLevelNodes(n->right, d + 1);
}
//vector<int>
map<int, vector<int>> m_nodes_val;
void listUpSameLevelNodes_val(TreeNode* n, int d = 1) {
if (n == nullptr) return;
m_nodes_val[d].push_back(n->val);
listUpSameLevelNodes_val(n->left, d + 1);
listUpSameLevelNodes_val(n->right, d + 1);
}
//set<int>
map<int, set<int>> m_nodes_s;
void listUpSameLevelNodes_p(TreeNode* n, int d = 1) {
if (n == nullptr) return;
m_nodes_s[d].insert(n->val);
listUpSameLevelNodes(n->left, d + 1);
listUpSameLevelNodes(n->right, d + 1);
}
//+---------------------+
//| List up all leaves; |
//+---------------------+
vector<TreeNode*> v_leaves;
void listUpLeaves(TreeNode* n) {
if (n == nullptr) return;
if (isLeaf(n)) {
v_leaves.push_back(n);
return;
}
listUpLeaves(n->left);
listUpLeaves(n->right);
}
void listUpLeaves_val(TreeNode* n, vector<int>& v) {
if (n == nullptr) return;
if (isLeaf(n)) {
v.push_back(n->val);
return;
}
listUpLeaves_val(n->left, v);
listUpLeaves_val(n->right, v);
}
//+---------------------+-------------+
//| Sum up values of all under nodes. |
//+-----------------------------------+
int sumNodes(TreeNode* n) {
if (n == nullptr)return 0;
return n->val + sumNodes(n->left) + sumNodes(n->right);
}
//+----------------+
//| Scan Tree Node |
//+----------------+
//pre order
Vi preOrder;
void preOrderScan(TreeNode* n) {
if (n == nullptr)return;
preOrder.push_back(n->val);
preOrderScan(n->left);
preOrderScan(n->right);
}
//in order
Vi inOrder;
void inOrderScan(TreeNode* n) {
if (n == nullptr)return;
inOrderScan(n->left);
inOrder.push_back(n->val);
inOrderScan(n->right);
}
//post order Binary Tree
Vi postOrder;
void postOrderScan(TreeNode* n) {
if (n == nullptr)return;
postOrderScan(n->left);
postOrderScan(n->right);
postOrder.push_back(n->val);
}
//pre order Node which has children.
Vi ans;
Vi preorder(Node* n) {
if (n == nullptr) return ans;
ans.push_back(n->val);
rep(i, 0, n->children.size()) preorder(n->children[i]);
return ans;
}
//post order Node which has children.
//vector<int> ans;
//vector<int> postorder(Node* n) {
// if (n == nullptr) return ans;
// rep(i, 0, n->children.size()) postorder(n->children[i]);
// ans.push_back(n->val);
// return ans;
//}
//+---------------------------------------+
//| Lowest Common Ancestor on Binary Tree |
//+---------------------------------------+
TreeNode* lowestCommonAncestor(TreeNode* n, TreeNode* p, TreeNode* q) {
if (n == nullptr)return n;
if (n->val > p->val && n->val > q->val) return lowestCommonAncestor(n->left, p, q);
else if (n->val < p->val && n->val < q->val) return lowestCommonAncestor(n->right, p, q);
return n;
}
//+--------------------+
//| check if same tree |
//+--------------------+
bool isSameTree(TreeNode* t, TreeNode* s) {
if (t == nullptr && s == nullptr) return true;
if (t == nullptr || s == nullptr) return false;
if (t->val != s->val) return false;
return isSameTree(t->left, s->left) && isSameTree(t->right, s->right);
}
//+-----------------------+
//| construct merged tree |
//+-----------------------+
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == nullptr && t2 == nullptr) return t1;
else if (t1 != nullptr && t2 != nullptr) {
t1->val += t2->val;
}
else if (t1 != nullptr && t2 == nullptr) {
return t1;
}
else if (t1 == nullptr && t2 != nullptr) {
return t2;
}
t1->left = mergeTrees(t1->left, t2->left);
t1->right = mergeTrees(t1->right, t2->right);
return t1;
}
//+-------------------------+
//| construct inverted tree |
//+-------------------------+
TreeNode* p;
void invert_dfs(TreeNode* n, TreeNode* p) {
if (n->right != nullptr) {
p->left = new TreeNode(n->right->val);
invert_dfs(n->right, p->left);
}
if (n->left != nullptr) {
p->right = new TreeNode(n->left->val);
invert_dfs(n->left, p->right);
}
}
TreeNode* invertTree(TreeNode* n) {
if (n == nullptr)return n;
p = new TreeNode(n->val);
invert_dfs(n, p);
return p;
}
//+------------------+
//| Trim Binary tree |
//+------------------+
TreeNode* trimBST(TreeNode* n, int L, int R) {
if (n == nullptr) return n;
if (n->val < L) {
n = trimBST(n->right, L, R);
}
else if (n->val > R) {
n = trimBST(n->left, L, R);
}
else {
n->left = trimBST(n->left, L, R);
n->right = trimBST(n->right, L, R);
}
return n;
}
//+-------------------------+
//| construct BST by vector |
//+-------------------------+
TreeNode* constructBST(vector<int>& v, int l, int r) {
int m = (l + r) / 2;
TreeNode* p = new TreeNode(v[m]);
if (l != r) {
if (m != l) p->left = constructBST(v, l, m - 1);
if (m != r) p->right = constructBST(v, m + 1, r);
}
return p;
}
TreeNode* sortedArrayToBST(vector<int>& v) {
if (v.size() == 0)return nullptr;
return constructBST(v, 0, v.size() - 1);
}
};
Author And Source
この問題について(Leetcode Binary Tree 用の関数一覧), 我々は、より多くの情報をここで見つけました https://qiita.com/redpeaks33/items/804a09441942e68f9256著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .