Leetcode 두 갈래 나무 문제 풀이 보고서
1. Binary Tree Preorder Traversal
Description
Given a binary tree, return the preorder traversal of its nodes' values. Example:
Input: [1,null,2,3] 1 2/3
Output: [1,2,3]
Analysis
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
Solution
// , , , , 。
// , 。
class Solution {
public:
vector preorderTraversal(TreeNode* root) {
vector result;
stack s;
if(root!=nullptr)
s.push(root);
while(!s.empty())
{
TreeNode* p = s.top();
result.push_back(p->val);
s.pop();
if(p->right!=nullptr)
s.push(p->right);
if(p->left!=nullptr)
s.push(p->left);
}
return result;
}
};
2.Binary Tree Inorder Traversal
Description
Given a binary tree, return the inorder traversal of its nodes' values.
Example:
Input: [1,null,2,3] 1 2/3
Output: [1,3,2]
Analysis
Solution
// , , 。
class Solution {
public:
vector inorderTraversal(TreeNode* root) {
vector result;
stack s;
TreeNode* p = root;
while(!s.empty() || p!=nullptr)
{
if(p!=nullptr)
{
s.push(p);
p = p->left;
}
else
{
//
p = s.top();
s.pop();
result.push_back(p->val);
//
p = p->right;
}
}
return result;
}
};
3.Binary Tree Postorder Traversal
Description
Given a binary tree, return the postorder traversal of its nodes' values.
Example:
Input: [1,null,2,3] 1 2/3
Output: [3,2,1]
Analysis
Solution
class Solution {
public:
vector postorderTraversal(TreeNode* root) {
vector result;
stack s;
TreeNode *p=root, *q = nullptr;
do
{
//
while(p!=nullptr)
{
s.push(p);
p = p->left;
}
q = nullptr;
while(!s.empty())
{
p = s.top();
s.pop();
// , ,
if(p->right == q)
{
result.push_back(p->val);
//
q = p;
}
// , , ,
else
{
s.push(p);
p = p->right;
break;
}
}
}while(!s.empty());
return result;
}
};
총결산
//
void preorder(TreeNode *root)
{
if(root!=nullptr)
{
visit(root);
preorder(root->left);
preorder(root->right);
}
}
//
void inorder(TreeNode *root)
{
if(root!=nullptr)
{
inorder(root->left);
visit(root);
inorder(root->right);
}
}
//
void postorder(TreeNode *root)
{
if(root!=nullptr)
{
postorder(root->left);
postorder(root->right);
visit(root);
}
}
4. Binary Tree Level Order Traversal
Description
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example: Given binary tree [3,9,20,null,null,15,7], 3/ 9 20/ 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ]
Analysis
class Solution {
public:
vector > levelOrder(TreeNode *root) {
vector > res;
if (root == NULL) return res;
//
queue q;
//
q.push(root);
while (!q.empty()) {
//
vector oneLevel;
int size = q.size();
for (int i = 0; i < size; ++i) {
TreeNode *node = q.front();
q.pop();
oneLevel.push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
res.push_back(oneLevel);
}
return res;
}
};
5. Same Tree
Description
Given two binary trees, write a function to check if they are the same or not.
Two binary trees are considered the same if they are structurally identical and the nodes have the same value.
Analysis
Solution
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
// ,
if(!p && !q)
return true;
//
if(!p || !q)
return false;
// , ,
return (p->val==q->val) && (isSameTree(p->left, q->left))
&& (isSameTree(p->right, q->right));
}
};
6. Symmetric Tree
Decription
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Analysis
Solution
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root)
return true;
else
return isSymmetric(root->left, root->right);
}
bool isSymmetric(TreeNode *p, TreeNode *q)
{
if(!p && !q)
return true;
if(!p || !q)
return false;
return (p->val == q->val) && (isSymmetric(p->left, q->right))
&& (isSymmetric(p->right, q->left));
}
};
7. Construct Binary Tree from Preorder and Inorder Traversal
Description
Given preorder and inorder traversal of a tree, construct the binary tree.
Analysis
Solution
class Solution {
public:
TreeNode *buildTree(vector &preorder, vector &inorder) {
return buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
TreeNode *buildTree(vector &preorder, int pLeft, int pRight, vector &inorder, int iLeft, int iRight) {
if (pLeft > pRight || iLeft > iRight) return NULL;
int i = 0;
for (i = iLeft; i <= iRight; ++i) {
if (preorder[pLeft] == inorder[i]) break;
}
TreeNode *cur = new TreeNode(preorder[pLeft]);
cur->left = buildTree(preorder, pLeft + 1, pLeft + i - iLeft, inorder, iLeft, i - 1);
cur->right = buildTree(preorder, pLeft + i - iLeft + 1, pRight, inorder, i + 1, iRight);
return cur;
}
};
8. Construct Binary Tree from Inorder and Postorder Traversal
Description
Given inorder and postorder traversal of a tree, construct the binary tree.
Analysis
Solution
class Solution {
public:
TreeNode *buildTree(vector &inorder, vector &postorder) {
return buildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
}
TreeNode *buildTree(vector &inorder, int iLeft, int iRight, vector &postorder, int pLeft, int pRight) {
if (iLeft > iRight || pLeft > pRight) return NULL;
TreeNode *cur = new TreeNode(postorder[pRight]);
int i = 0;
for (i = iLeft; i < inorder.size(); ++i) {
if (inorder[i] == cur->val) break;
}
cur->left = buildTree(inorder, iLeft, i - 1, postorder, pLeft, pLeft + i - iLeft - 1);
cur->right = buildTree(inorder, i + 1, iRight, postorder, pLeft + i - iLeft, pRight - 1);
return cur;
}
};
총결산
9. Minimum Depth of Binary Tree
Description
Given a binary tree, find its minimum depth.
The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.
Note: A leaf is a node with no children.
Analysis
귀속, 빈 트리에 0 반환하기;
왼쪽 트리가 비어 있으면 오른쪽 트리의 최소 깊이 +1을 되돌려줍니다.(1을 더하는 것은 뿌리를 덧붙여야 하기 때문이다. 아래와 같다)
오른쪽 트리가 비어 있으면 왼쪽 트리의 최소 깊이 +1을 되돌려줍니다.
좌우 트리가 비어 있지 않으면 왼쪽, 오른쪽 트리의 최소 깊이의 작은 값을 취하고 +1;
Solution
class Solution {
public:
int minDepth(TreeNode* root) {
// , brother
return minDepth(root, false);
}
int minDepth(TreeNode* p, bool hasbrother)
{
//
if(!p)
return hasbrother?INT_MAX:0;
//
//
return 1+min(minDepth(p->left, p->right!=NULL),
minDepth(p->right, p->left!=NULL));
}
};
10. Maximum Depth of Binary Tree
Description
Given a binary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.
Note: A leaf is a node with no children.
Analysis
Given a binary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.
Note: A leaf is a node with no children.
Analysis
Solution class Solution {
public:
int maxDepth(TreeNode* root) {
if(!root)
return 0;
else
return 1+max(maxDepth(root->left), maxDepth(root->right));
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
class Solution {
public:
int maxDepth(TreeNode* root) {
if(!root)
return 0;
else
return 1+max(maxDepth(root->left), maxDepth(root->right));
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.